Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Java linked list. Java linked list - definition ▪ Often in programming we are required to systematically store some type of information. A prime example.

Similar presentations


Presentation on theme: "1 Java linked list. Java linked list - definition ▪ Often in programming we are required to systematically store some type of information. A prime example."— Presentation transcript:

1 1 Java linked list

2 Java linked list - definition ▪ Often in programming we are required to systematically store some type of information. A prime example of this is to use arrays, but when you don’t know the amount of information to be stored we need a dynamic data structure. ▪ One option for us is to use a linked list. A linked list works by creating a collection of objects (nodes) which both carry the data we want to store and a reference to the next node in the list. ▪ There is more than one type of a linked list. Some different type of linked list are shown below: 1. Singly linked list. Root node links one way through all the nodes. Last node links to NULL. 2. Doubly linked list. Every nodes stores a reference to its previous node as well as its next. Last node links to NULL. 2

3 Java linked list, cont. 3. Circular linked list. Circular linked list have a reference to one node which is the tail node and all the nodes are linked together in one direction forming a circle. ▪ A singly linked list is a linear data structure where each element (node) is a separate object. Tail Node datanextNode Field nextNode references a Node object, an object of the same class. Field data references the object of the class.

4 Class List - definitions Class List represents a singly linked list. Each element ( we will call it a node ) of a list is comprising of two items - the data and a reference to the next node. The last node has a reference to null. The entry point into a linked list is called the head of the list. It should be noted that head is not a separate node, but the reference to the first node. If the list is empty then the head is a null reference. The number of nodes in a list is not fixed and can grow and shrink on demand. In Java we are allowed to define a class (say, B) inside of another class (say, A). The class A is called the outer class, and the class B is called the inner class. The purpose of inner classes is purely to be used internally as helper classes. The List class is the outer class and the Node class is the inner class. 4

5 Class List - methods N Method’s nameMethod’s description 1List()Constructor builds an empty linked list. 2boolean isEmpty()Returns true if this list is empty and false otherwise. 3Node getFirst()Returns the reference to first element in this list. If list is empty returns null. 4Node insert(Node pos, T x) Inserts the type T element x after the specified position pos in this list and returns the reference to inserted element x. 5Node remove(Node pos) Removes the first occurrence of the specified element pos in this list and returns the next element position. We assume that pos != null. 6String to String()Returns the string representation of linked list. 5

6 Outer class List - UML diagram List Node first List() boolean isEmpty() Node getFirst() Node insert(Node pos, T x) Node remove(Node pos) String toString() Class name Class variable Class methods Constructor 6

7 Inner class Node - UML diagram Node private T data private Node nextNode Node(T x) Node( T data, Node nextNode ) T getData() Node getNext() Void setData( T data) Void setNext(Node nextNode) String toString() Constructors Class variables Class methods Class name

8 Class List - implementation public class List { private Node first; // class List attribute public List() { this.first = null; } // class List constructor public Node getFirst() { return this.first; } // getFirst public boolen isEmpty() { return this.first == null; } // isEmpty public String toString() { String str = “ [ “; Node pos = this.first; while(pos != null) { str = str + pos.getData(); // class Node method if(pos.getNext() != null) str = str + ”, ”; pos = pos.getNext(); } // while str = str + “]”; return str; } // toString 8

9 Class List – implementation,cont. public Node insert(Node pos, T x) { Node q = new Node (x); // creating new node if( pos == null ) { q.setNext(this.first); this.first = q; // first element in the list } else { q.setNext(pos.getNext()); pos.setNext(q); } return q; } // insert public Node remove(Node pos) { if( this.first == pos ) { this.first = pos.getNext(); // remove first node return this.first; } else { Node prev = this.first; while(prev.getNext() != pos) // searching pos reference prev = prev.getNext(); prev.setNext(pos.getNext()); return prev.getNext(); } } // remove } // class List Note: Class Node methods 9

10 Class List - test This program reads the names of 10 students,builds linked list and prints the names which begins with an ‘A’ character. public static void main(String args[ ]) { List studNames = new List (); Node last = null; for(int i = 0; i < 10; i++) { System.out.println(“ Enter student name “); String name = reader.next(); last = studNames.insert(last,name); } // for Node p = studNames.getFirst(); while(p != null ) { if( p.getData().charAt(0) == ‘A’) System.out.println(p.getData()); p = p.getNext(); } //while } // main 10 public Node insert(Node pos, T x) { Node q = new Node (x); if( pos == null ) { q.setNext(this.first); this.first = q; // first element in the list } else { q.setNext(pos.getNext()); pos.setNext(q); } return q; } // insert

11 Class List – using external methods public static void nameA(Node p) { while(p != null ) { if( p.getData().charAt(0) == 'A') // getData from Node class, charAt() from String class System.out.println(p.getData()); p = p.getNext(); } // while } // nameA public static void main(String args[ ]) { List studNames = new List (); Node last = null; for(int i = 0; i < 10; i++) { System.out.println(“ Enter student name “); String name = reader.next(); last = studNames.insert(last,name); } // for Node pl = studNames.getFirst(); nameA(pl); // calling method nameA from main method } // main 11

12 External methods – “what is” questions 12 1. What is the output for the next program giving the following linked list? public static void what(List list) { Node a = list.getFirst(); Node b = list.getFirst(); while (b != null ) { Node temp = a; a = a.getNext(); b = b.getNext(); list.remove(temp); if (b != null) b = b.getNext(); } // while } // what 2. What is the purpose of the what method ? public static void main(String[ ] args) { List ls = new List (); Node last = null; System.out.print(" enter an integer -> "); int x = reader.nextInt(); while ( x != 777) { last = ls.insert(last, x); System.out.print(" enter an integer -> "); x = reader.nextInt(); } // while System.out.println(ls); what(ls); // calling what method System.out.println(ls); } // main

13 “what is” questions - trace 13 b a temp a bb list a b temp b b != null -> T public static void what(List list) { Node a = list.getFirst(); Node b = list.getFirst(); while (b != null ) { Node temp = a; a = a.getNext(); b = b.getNext(); list.remove(temp); if (b != null) b = b.getNext(); } // while } // what

14 “what is” questions - solution 14 enter an integer -> 1 enter an integer -> 2 enter an integer -> 3 enter an integer -> 4 enter an integer -> 777 [ 1, 2, 3, 4 ] [ 3, 4 ] Linked list values sentinel List before calling what List after calling what The what method removes the first half giving in the linked list. output

15 Class List methods - example1 This program reads the coordinates of 10 points, builds linked list of Point type and prints the coordinates of points which their value sums up to 20. public static void main(String args[ ]) { List ls = new List (); Node last = null; for( int i = 0; i < 10; i++) { System.out.print(" enter X-> "); int x = reader.nextInt(); System.out.print(" enter Y-> "); int y = reader.nextInt(); last = ls.insert( last, new Point(x,y) ); } // for System.out.println(ls); printP20(ls); // calling external method (next slide) } // main Building Point type linked list Creating Point type linked list 15

16 Class List - method printP20 public static void printP20(List lst) { Node pos = lst.getFirst(); while( pos != null ) { Point point = pos.getData(); if( point.getX() + point.getY() <= 20) System.out.println(point); pos = pos.getNext(); } // while } // printP20 Class Node method Class Point methods Class List method 16

17 method main - what’s different? public static void main(String args[ ]) { List ls = new List (); for( int i = 0; i < N; i++) { System.out.print(" enter X-> "); int x = reader.nextInt(); System.out.print(" enter Y-> "); int y = reader.nextInt(); ls.insert( null, new Point(x,y) ); } // for System.out.println(ls); printP20(ls); // calling external method } // main public static void main(String args[ ]) { List ls = new List (); Node last = null; for( int i = 0; i < N; i++) { System.out.print(" enter X-> "); int x = reader.nextInt(); System.out.print(" enter Y-> "); int y = reader.nextInt(); last= ls.insert( last, new Point(x,y) ); } // for System.out.println(ls); printP20(ls); // calling external method } // main 17

18 method main output, N = 3 enter X-> 1 enter Y-> 2 enter X-> 3 enter Y-> 4 enter X-> 5 enter Y-> 6 [ x= 1.0 y= 2.0, x= 3.0 y= 4.0, x= 5.0 y= 6.0] x= 1.0 y= 2.0 x= 3.0 y= 4.0 x= 5.0 y= 6.0 enter X-> 1 enter Y-> 2 enter X-> 3 enter Y-> 4 enter X-> 5 enter Y-> 6 [ x= 5.0 y= 6.0, x= 3.0 y= 4.0, x= 1.0 y= 2.0] x= 5.0 y= 6.0 x= 3.0 y= 4.0 x= 1.0 y= 2.0 public Node insert(Node pos, T x) { Node q = new Node (x); if( pos == null ) { q.setNext(this.first); this.first = q; // first element in the list } // if else { q.setNext(pos.getNext()); pos.setNext(q); } // else return q; } // insert 18

19 This method checks if the linked list of String type is sorted public static boolean isSorted(List lst) { Node pos = lst.getFirst(); while(pos != null) { if( pos.getNext() != null ) if( pos.getData().compareTo(pos.getNext().getData() ) > 0 ) return false; pos = pos.getNext(); } // while return true; } // isSorted 19 Class List methods – example2

20 Example2 – main and executions public static void main(String args[ ]) { List ls = new List (); Node last = null; for(int i = 1; i < 5; i++) { System.out.print(" enter the string "); String x = reader.next(); last = ls.insert(last, x); } // for System.out.println(ls); if(isSorted(ls)) System.out.println("YES"); else System.out.println("NO"); } // main enter the string hello enter the string hi enter the string word enter the string bee [ hello, hi, word, bee ] NO enter the string bee enter the string hello enter the string hi enter the string word [ bee, hello, hi, word ] YES 20

21 Class List methods - example 3 public static void remDuplications(List lst) { Node pos1= lst.getFirst(), pos2; while( pos1 != null ) { char ch = pos1.getData(); pos2 = pos1.getNext(); while( pos2 != null ) { if(pos2.getData() == ch) pos2 = lst.remove(pos2); else pos2 = pos2.getNext(); } // inner while pos1 = pos1.getNext(); } // outer while } // remDuplications 21 This method removes all duplications in Character type linked list sabaaz null lst sabz nulllst

22 Example3 – main and executions public static void main (String[ ] args) { List ls = new List (); Node last = null; System.out.print( " enter the character -> “ ); char x = reader.next().charAt(0); while ( x != ‘*’ ) { last = ls.insert(last, x); System.out.print( " enter the character -> “ ); x = reader.next().charAt(0); } // while System.out.println(ls); remDuplications(ls); System.out.println(ls); } // main 22 enter the character -> a enter the character -> s enter the character -> a enter the character -> b enter the character -> a enter the character -> z enter the character -> * [ a, s, a, b, a, z ] [ a, s, b, z ] sentinel

23 Merging two linked list Write a Java program that contains a method with the capability to merge two integer type sorted linked lists ( lst1 and lst2 ). The merged result should be in the third linked list ( lst3 ) that is in sorted order. Do not destroy the original lists. Your program should output the content of three linked lists to show the program performs properly. 23

24 Method merge2Lists public static List merge2Lists(List lst1, List lst2) { Node pos1 = lst1.getFirst(), pos2 = lst1.getFirst(), pos3 = null; List lst3 = new List (); while( pos1 != null && pos2 != null ) { if( pos1.getData() > pos2.getData() ) { pos3 = lst3.insert(pos3,pos2.getData()); pos2 = pos2.getNext(); } else { pos3 = lst3.insert(pos3,pos1.getData()); pos1 = pos1.getNext(); } // if } // while while(pos1 != null) { pos3 = lst3.insert(pos3,pos1.getData()); pos1 = pos1.getNext(); } // while while(pos2 != null) { pos3 = lst3.insert(pos2,pos2.getData()); pos1 = pos2.getNext(); } // while return lst3; } // merge2List 24

25 merge2Lists – main and executions public static void main(String[ ] args) { List lst1 = new List (), lst2 = new List (); Node last = null; System.out.print(" enter an integer -> "); int x = reader.nextInt(); while ( x != 777) { last = lst1.insert(last, x); System.out.print(" enter an integer -> "); x = reader.nextInt(); } // while last = null; System.out.print(" enter an integer -> "); x = reader.nextInt(); while ( x != 777) { last = lst2.insert(last, x); System.out.print(" enter an integer -> "); x = reader.nextInt(); } // while List lst3 = merge2Lists(ls1,ls2); System.out.println(ls1); System.out.println(ls2); System.out.println(ls3); } // main 25 enter an integer -> 1 enter an integer -> 2 enter an integer -> 5 enter an integer -> 8 enter an integer -> 9 enter an integer -> 777 enter an integer -> 3 enter an integer -> 4 enter an integer -> 7 enter an integer -> 777 [ 1, 2, 5, 8, 9 ] [ 3, 4, 7 ] [ 1, 2, 3, 4, 5, 7, 8, 9 ] lst1 lst2 sentinel output

26 Class List methods - example 4 26 This method calculates the number of different values in the integer type linked list. public static int countDifItems(List list) { Node temp, pos = list.getFirst(); int count = 0; // number of different values while(pos != null) { temp = pos.getNext(); boolean found = false; // not found while(temp != null) { if(temp.getData() == pos.getData()) { found = true; break; } // if temp = temp.getNext(); } // inner while if( !found ) count++; pos = pos.getNext(); } // outer while return count; } // countDifItems 3

27 Example4 – main and executions 27 public static void main(String[ ] args) { List ls = new List (); Node last = null; System.out.print(" enter an integer -> "); int x = reader.nextInt(); while ( x != 777) { last = ls.insert(last, x); System.out.print(" enter an integer -> "); x = reader.nextInt(); } // while System.out.println(ls); System.out.println(“Count = " + countDifItems(ls)); } // main enter an integer -> 1 enter an integer -> 2 enter an integer -> 1 enter an integer -> 2 enter an integer -> 5 enter an integer -> 777 [ 1, 2, 1, 2, 5 ] Count = 3

28 Class List methods - example 5 28 This method checks if the linked list of integer type is circular linked list public static boolean checkCircle(List list) { Node a = list.getFirst(); Node b = list.getFirst(); while ( b != null ) { a = a.getNext(); b = b.getNext(); if ( b != null ) b = b.getNext(); else return false; if (a == b) return true; } // while return false; } // checkCircle Tail

29 Example5 – main and executions 29 public static void main(String[ ] args) { List ls = new List (); Node last = null; System.out.print(" enter an integer -> "); int x = reader.nextInt(); while ( x != 777) { last = ls.insert(last, x); System.out.print(" enter an integer -> "); x = reader.nextInt(); } //while System.out.println(ls); if(checkCircle(ls)) System.out.println("YES"); else System.out.println("NO"); } // main enter an integer -> 1 enter an integer -> 2 enter an integer -> 3 enter an integer -> 4 enter an integer -> 5 enter an integer -> 777 [ 1, 2, 3, 4, 5 ] YES /* building circular linked list */ Node pos = ls.getFirst(); Node first = ls.getFirst(); while(pos.getNext() != null ) pos = pos.getNext(); pos.setNext(first); enter an integer -> 1 enter an integer -> 2 enter an integer -> 3 enter an integer -> 4 enter an integer -> 5 enter an integer -> 777 [ 1, 2, 3, 4, 5 ] NO

30 Class List recursive method1 30 This method tests if the number which passed as parameter exists in the linked list of integer type. public static boolean what1(List lst, int num) { boolean ans; // returned value int temp; // help variable if( lst.isEmpty() ) ans = false; else { temp = lst.getFirst().getData(); lst.remove(lst.getFirst()); ans = (temp == num) || what1(lst,num); lst.insert(null, temp); } // if return ans; } // what

31 Recursive methods1 debugging 31 public static boolean what1(List lst, int num) { boolean ans; // returned value int temp; // help variable if( lst.isEmpty() ) ans = false; else { temp = lst.getFirst().getData(); lst.remove(lst.getFirst()); ans = (temp == num) || what1(lst,num); System.out.println("before insert temp“ + lst); lst.insert(null, temp); System.out.println(“after insert temp“ + lst); } // else return ans; } // what1 enter an integer -> 1 enter an integer -> 2 enter an integer -> 3 enter an integer -> 777 [ 1, 2, 3 ] enter search number -> 5 before insert temp [ ] after insert temp [ 3 ] before insert temp [ 3 ] after insert temp [ 2, 3 ] before insert temp [ 2, 3 ] after insert temp [ 1, 2, 3 ] NO enter an integer -> 1 enter an integer -> 2 enter an integer -> 3 enter an integer -> 777 [ 1, 2, 3 ] enter search number -> 2 before insert temp [ 3 ] after insert temp [ 2, 3 ] before insert temp [ 2, 3 ] after insert temp [ 1, 2, 3 ] YES

32 Linked list recursive method2 public static int what2(Node lst) { if ( lst == null ) return 0; Node pos = lst.getNext(); int temp = what2(pos); if( !(temp % 2 == 0) ) { System.out.println( "temp= “ + temp); System.out.println(pos.getData()); } return temp + 1; } // what2 32 This method take the reference to first element in the singly linked list as parameter. What is the output of the method for the following linked list ?

33 recursive method2 - solution 33 [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] temp = 1 9 temp = 3 7 temp = 5 5 temp = 7 3 what2 = 9 public static void main(String[ ] args) { List ls = new List (); Node last = null; System.out.print(" enter an integer -> "); int x = reader.nextInt(); while ( x !=777) { last = ls.insert(last, x); System.out.print(" enter an integer -> "); x = reader.nextInt(); } // while System.out.println(ls); Node first = ls.getFirst(); System.out.println("what2 = " + what2(first)); } // main This will produce the next output : Method what2 returns the number of elements in the singly linked list.

34 Class List methods - exam question 34 Write the method: public static int MaxSubList( List lst, char x, char y ) The method receives the length of the largest sub-list, which can be found between characters x and y. If such sub-list is not found the method receives 0. For example: If we have the following list: lst = 'a', 'd', 'z', 'a', 't', 't', 'a', 'y', 'w‘ The method MaxSubList(lst,'z','a') receives the value 5 ( lst = z, a, t, t, a ). The method MaxSubList(lst,'w','w') receives the value 1. The method MaxSubList(lst,'a','k') receives the value 0.

35 Exam question - solution public static int MaxSubList ( List lst, char x, char y ) { Node pos = lst.getFirst(); boolean start = false; // found x value int maxLen = 0; // largest sub-list length int curLen = 0; // current sub-list length while (pos != null) { if (pos.getData() == x( { start = true; break; } // if pos = pos.getNext(); } // while if (x == y) curLen = 1; while (pos != null && start) { if (pos.getData() == y) { maxLen += curLen; curLen = 0; } // if curLen++; pos = pos.getNext(); } // while return maxLen; } // MaxSubList 35


Download ppt "1 Java linked list. Java linked list - definition ▪ Often in programming we are required to systematically store some type of information. A prime example."

Similar presentations


Ads by Google