* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download Singly-Linked List
Survey
Document related concepts
Transcript
1/ 124 1 COP 3503 FALL 2012 SHAYAN JAVED LECTURE 18 Programming Fundamentals using Java 2/ 124 Data Structures 3/ 124 So far... Looked at Arrays and ArrayLists as our data structures 4/ 124 So far... Looked at Arrays and ArrayLists as our data structures Very useful, but not always the best options 5/ 124 So far... Looked at Arrays and ArrayLists as our data structures Very useful, but not always the best options Going to look at some other data structures 6/ 124 Data Structures Stack Queue Linked List Trees Graph Hashtable etc. 7/ 124 Data Structures Stack Queue Linked List Trees Graph Hashtable etc. 8/ 124 Stack Last-In-First-Out (LIFO) Data Structure 9/ 124 Stack Last-In-First-Out (LIFO) Data Structure Basically...a stack of data. 10/ 124 Stack Last-In-First-Out (LIFO) Data Structure Basically...a stack of data. Used when you want the oldest added data first. 11/ 124 Stack Last-In-First-Out (LIFO) Data Structure Basically...a stack of data. Used when you want the oldest added data first. Abstract data type (can store any kind of data). 12/ 124 Stack Three Operations: 13/ 124 Stack Three Operations: push(Object): Pushes an object on top of a stack 14/ 124 Stack Three Operations: push(Object): Pushes an object on top of a stack pop(): Returns the object at the top of the stack and removes it 15/ 124 Stack Three Operations: push(Object): Pushes an object on top of a stack pop(): Returns the object at the top of the stack and removes it peek(): Returns the object at the top without removing it 16/ 124 Stack Some uses: 17/ 124 Stack Some uses: “Stack Frame” for method calls. 18/ 124 Stack Some uses: “Stack Frame” for method calls. Used for evaluating arithmetic expressions: (prefix, postfix, infix) 19/ 124 Stack Java provides a Stack class (java.util.Stack) 20/ 124 Stack Java provides a Stack class (java.util.Stack) Has all the operations 21/ 124 Stack Java provides a Stack class (java.util.Stack) Has all the operations But how does it actually store the data? (What’s the “back-end”?) 22/ 124 Stack Java provides a Stack class (java.util.Stack) Has all the operations But how does it actually store the data? (What’s the “back-end”?) Uses the java.util.Vector class (similar to ArrayList) 23/ 124 Queue A First-In-First-Out (FIFO) data structure. 24/ 124 Queue A First-In-First-Out (FIFO) data structure. Used when you want the oldest added data first. 25/ 124 Queue A First-In-First-Out (FIFO) data structure. Used when you want the oldest added data first. Often used for scheduling (handle first in line) 26/ 124 Queue Three Operations: enqueue(Object): Adds an object to the queue dequeue(): Returns the object at the front of the queue and removes it peek(): Returns the object at the front without removing it 27/ 124 Queue Java provides a Queue interface (java.util.Queue) 28/ 124 Queue Java provides a Queue interface (java.util.Queue) Has all the operations enqueue = add dequeue = poll 29/ 124 Queue Java provides a Queue interface (java.util.Queue) Has all the operations enqueue = add dequeue = poll Interface implemented in classes like LinkedList 30/ 124 Queue Java provides a Queue interface (java.util.Queue) Has all the operations enqueue = add dequeue = poll Interface implemented in classes like LinkedList Queue<Integer> queue = new LinkedList<Integer>(); 31/ 124 Arrays and ArrayLists Work well in a lot of cases. 32/ 124 Arrays and ArrayLists Work well in a lot of cases. Can use as “back-end” data structures 33/ 124 Arrays and ArrayLists Work well in a lot of cases. Can use as “back-end” data structures But where do they fall short? 34/ 124 Arrays and ArrayLists Work well in a lot of cases. Can use as “back-end” data structures But where do they fall short? Data retrieval – excellent O(1) 35/ 124 Arrays and ArrayLists Work well in a lot of cases. Can use as “back-end” data structures But where do they fall short? Data retrieval – excellent O(1) Adding data 36/ 124 Arrays and ArrayLists Work well in a lot of cases. Can use as “back-end” data structures But where do they fall short? Data retrieval – excellent O(1) Adding data – inefficient O(n) in some cases 37/ 124 Arrays and ArrayLists Work well in a lot of cases. Can use as “back-end” data structures But where do they fall short? Data retrieval – excellent O(1) Adding data – inefficient O(n) in some cases 38/ 124 Arrays and ArrayLists Work well in a lot of cases. Can use as “back-end” data structures But where do they fall short? Data retrieval – excellent O(1) Adding data – inefficient O(n) in some cases Fixed size – have to shift/copy to new array 39/ 124 Arrays and ArrayLists What if your application requires a lot of adds but not retrievals? 40/ 124 Arrays and ArrayLists What if your application requires a lot of adds but not retrievals? Use Linked Lists 41/ 124 Linked List A list – a collection of linked nodes. 42/ 124 Linked List A list – a collection of linked nodes. Dynamic data structure – size is not fixed, and memory is not contiguous (unlike an array) 43/ 124 Linked List A list – a collection of linked nodes. Dynamic data structure – size is not fixed, and memory is not contiguous (unlike an array) Insertion to the list is very fast – O(1) in most cases 44/ 124 Linked List A list – a collection of linked nodes. Dynamic data structure – size is not fixed, and memory is not contiguous (unlike an array) Insertion to the list is very fast – O(1) in most cases Indexing is slow. Random access also not possible 45/ 124 Linked List Many variations: Singly-Linked List (can only traverse forward) Doubly-Linked List (can traverse in reverse too) Circular Linked Lists Multi-Linked Lists etc. 46/ 124 Node Basic structure – collection of linked nodes make a linked list. 47/ 124 Node Basic structure – collection of linked nodes make a linked list. Stores some data and a link to the next Node. 48/ 124 Node Basic structure – collection of linked nodes make a linked list. Stores some data and a link to the next Node. int null 49/ 124 Node Basic structure – collection of linked nodes make a linked list. Stores some data and a link to the next Node. int int null 50/ 124 Singly-Linked List (SLL) Nodes connected to each other 51/ 124 Singly-Linked List (SLL) int Nodes connected to each other int int null 52/ 124 Singly-Linked List (SLL) int Nodes connected to each other int int SLL only stores links to two nodes: null 53/ 124 Singly-Linked List (SLL) Nodes connected to each other int int int head SLL only stores links to two nodes: Head node (front) null 54/ 124 Singly-Linked List (SLL) Nodes connected to each other int int int head SLL only stores links to two nodes: Head node (front) Tail node (end) tail null 55/ 124 Singly-Linked List (SLL) Operations: LinkedList(): create an empty list 56/ 124 Singly-Linked List (SLL) Operations: LinkedList(): append(Object): create an empty list add to the end 57/ 124 Singly-Linked List (SLL) Operations: LinkedList(): append(Object): insert(Object, index): create an empty list add to the end add at a certain index 58/ 124 Singly-Linked List (SLL) Operations: LinkedList(): append(Object): insert(Object, index): remove(index): remove(Object): create an empty list add to the end add at a certain index remove Object at index remove Object 59/ 124 Singly-Linked List (SLL) Operations: LinkedList(): append(Object): insert(Object, index): remove(index): remove(Object): get(Object): get(index): create an empty list add to the end add at a certain index remove Object at index remove Object return index of Object return Object at index 60/ 124 Singly-Linked List (SLL) Operations: LinkedList(): append(Object): insert(Object, index): remove(index): remove(Object): get(Object): get(index): size(): create an empty list add to the end add at a certain index remove Object at index remove Object return index of Object return Object at index return size of the list 61/ 124 Singly-Linked List (SLL) Operations: LinkedList(): append(Object): insert(Object, index): remove(index): remove(Object): get(Object): get(index): size(): clear(): create an empty list add to the end add at a certain index remove Object at index remove Object return index of Object return Object at index return size of the list empty the list 62/ 124 Singly-Linked List (SLL) Create an Empty SLL: 63/ 124 Singly-Linked List (SLL) Create an Empty SLL: head tail null 64/ 124 Singly-Linked List (SLL) Create an Empty SLL: head tail null public SLL() { head = null; tail = null; } 65/ 124 Singly-Linked List (SLL) append(Object): 66/ 124 Singly-Linked List (SLL) append(Object): Obj null Create a Node with that Object 67/ 124 Singly-Linked List (SLL) append(Object): head tail Obj null Create a Node with that Object 68/ 124 Singly-Linked List (SLL) append(Object): head append another object tail Obj null 69/ 124 Singly-Linked List (SLL) append(Object): head tail Obj append another object null Obj Create a Node with that Object null 70/ 124 Singly-Linked List (SLL) append(Object): head tail Obj append another object Obj Create a Node with that Object Make tail point to it null 71/ 124 Singly-Linked List (SLL) append(Object): head tail Obj append another object Obj Create a Node with that Object Make tail point to it Update tail Node null 72/ 124 Singly-Linked List (SLL) size(): 73/ 124 Singly-Linked List (SLL) size(): head Obj tail Obj Obj Obj null 74/ 124 Singly-Linked List (SLL) size(): head Obj temp tail Obj Obj Obj null 75/ 124 Singly-Linked List (SLL) size(): head Obj temp tail Obj Obj Obj null 76/ 124 Singly-Linked List (SLL) size(): head Obj temp tail Obj Obj Obj null 77/ 124 Singly-Linked List (SLL) size(): head Obj temp tail Obj Obj Obj null 78/ 124 Singly-Linked List (SLL) size(): head Obj temp tail Obj Obj Obj null 79/ 124 Singly-Linked List (SLL) size(): head Obj temp tail Obj Obj Obj Keep incrementing until you reach “null”. null 80/ 124 Singly-Linked List (SLL) get(Object): Returns index of first Node with that object 81/ 124 Singly-Linked List (SLL) get(Object): Returns index of first Node with that object You should know how to traverse 82/ 124 Singly-Linked List (SLL) get(Object): Returns index of first Node with that object You should know how to traverse Compare object with equals() method 83/ 124 Singly-Linked List (SLL) get(Object): Returns index of first Node with that object You should know how to traverse Compare object with equals() method Return index if found -1 if not found 84/ 124 Singly-Linked List (SLL) remove(Object): head Obj tail Obj Obj Obj null 85/ 124 Singly-Linked List (SLL) remove(Object): head Obj tail Obj Obj Obj null 86/ 124 Singly-Linked List (SLL) remove(Object): head Obj tail Obj Obj Obj null 87/ 124 Singly-Linked List (SLL) remove(Object): Obj head Obj Obj tail Obj null 88/ 124 Singly-Linked List (SLL) remove(Object): head Obj tail Obj Obj null 89/ 124 Singly-Linked List (SLL) remove(Object): head Obj tail Obj Obj remove(index) - remove at a certain index remove(Node) - remove a certain Node Work the same way null 90/ 124 Singly-Linked List (SLL) So now we know how to: append, prepend, insert 91/ 124 Singly-Linked List (SLL) So now we know how to: append, prepend, insert find the size 92/ 124 Singly-Linked List (SLL) So now we know how to: append, prepend, insert find the size find the index of a specific element 93/ 124 Singly-Linked List (SLL) So now we know how to: append, prepend, insert find the size find the index of a specific element remove an object/Node 94/ 124 Singly-Linked List (SLL) So now we know how to: append, prepend, insert find the size find the index of a specific element remove an object/Node What about sorting? 95/ 124 Singly-Linked List (SLL) Sorting: Bubble Sort Selection Sort Insertion Sort 96/ 124 Singly-Linked List (SLL) Sorting: Bubble Sort Selection Sort Insertion Sort How many of these can you implement for Linked Lists? 97/ 124 Singly-Linked List (SLL) Sorting: We should swap nodes 98/ 124 Singly-Linked List (SLL) Sorting: We should swap nodes head Obj tail Obj Obj Obj null 99/ 124 Singly-Linked List (SLL) Sorting: We should swap nodes head Obj tail Obj Obj Obj null 100/ 124 Singly-Linked List (SLL) Sorting: We should swap nodes head Obj Obj tail Obj Obj null 101/ 124 Singly-Linked List (SLL) Sorting: We should swap nodes head Obj Obj tail Obj Obj null 102/ 124 Singly-Linked List (SLL) Sorting: We should swap nodes head Obj Obj tail Obj Obj null 103/ 124 Singly-Linked List (SLL) Sorting: We should swap nodes head Obj tail Obj Obj Obj null 104/ 124 Singly-Linked List (SLL) Sorting: We should swap nodes head Obj tail Obj Obj How many nodes were changed? Obj null 105/ 124 Singly-Linked List (SLL) Sorting: We should swap nodes head Obj tail Obj Obj How many nodes were changed? 3 Obj null 106/ 124 Singly-Linked List (SLL) Swap: head Obj tail Obj Obj Obj Obj null 107/ 124 Singly-Linked List (SLL) Swap: head Obj tail Obj Obj Obj Obj null 108/ 124 Singly-Linked List (SLL) Swap: head Obj tail Obj Obj Obj Obj Also have to modify the ones before them null 109/ 124 Singly-Linked List (SLL) Swap: head Obj node1 Obj node2 Obj Obj tail Obj Also have to modify the ones before them null 110/ 124 Singly-Linked List (SLL) Swap: node1P head Obj node2P node1 Obj node2 Obj Obj tail Obj Also have to modify the ones before them null 111/ 124 Singly-Linked List (SLL) Swap: RESULT: node1P head Obj node2P node2 Obj node1 Obj Obj tail Obj Also have to modify the ones before them We have now seen two cases null 112/ 124 Singly-Linked List (SLL) void swap(Node node1, Node node2, Node node1P, Node node2P) { if (node1.next == node2) { // side-by-side (1st case) node1.next = node2.next; node2.next = node1; } // 2nd case else { Node temp = node1.next; node1.next = node2.next; node2.next = temp; node2P.next = node1; } if (node1P != null) node1P.next = node2; // what about the head and tail nodes? // update them accordingly } // why? 113/ 124 Singly-Linked List (SLL) void swap(Node node1, Node node2, Node node1P, Node node2P) { if (node1.next == node2) { // side-by-side (1st case) node1.next = node2.next; node2.next = node1; } // 2nd case else { Node temp = node1.next; node1.next = node2.next; node2.next = temp; node2P.next = node1; } if (node1P != null) node1P.next = node2; // what about the head and tail nodes? // update them accordingly } // why? 114/ 124 Singly-Linked List (SLL) void swap(Node node1, Node node2, Node node1P, Node node2P) { if (node1.next == node2) { // side-by-side (1st case) node1.next = node2.next; node2.next = node1; } // 2nd case else { Node temp = node1.next; node1.next = node2.next; node2.next = temp; node2P.next = node1; } if (node1P != null) node1P.next = node2; // what about the head and tail nodes? // update them accordingly } // why? 115/ 124 Singly-Linked List (SLL) void swap(Node node1, Node node2, Node node1P, Node node2P) { if (node1.next == node2) { // side-by-side (1st case) node1.next = node2.next; node2.next = node1; } // 2nd case else { Node temp = node1.next; node1.next = node2.next; node2.next = temp; node2P.next = node1; } if (node1P != null) node1P.next = node2; // what about the head and tail nodes? // update them accordingly } // why? 116/ 124 Singly-Linked List (SLL) void swap(Node node1, Node node2, Node node1P, Node node2P) { if (node1.next == node2) { // side-by-side (1st case) node1.next = node2.next; node2.next = node1; } // 2nd case else { Node temp = node1.next; node1.next = node2.next; node2.next = temp; node2P.next = node1; } if (node1P != null) node1P.next = node2; // what about the head and tail nodes? // update them accordingly } // why? 117/ 124 Singly-Linked List (SLL) void swap(Node node1, Node node2, Node node1P, Node node2P) { if (node1.next == node2) { // side-by-side (1st case) node1.next = node2.next; node2.next = node1; } // 2nd case else { Node temp = node1.next; node1.next = node2.next; node2.next = temp; node2P.next = node1; } if (node1P != null) node1P.next = node2; // what about the head and tail nodes? // update them accordingly } // why? 118/ 124 Singly-Linked List (SLL) void swap(Node node1, Node node2, Node node1P, Node node2P) { if (node1.next == node2) { // side-by-side (1st case) node1.next = node2.next; node2.next = node1; } // 2nd case else { Node temp = node1.next; node1.next = node2.next; node2.next = temp; node2P.next = node1; // the node before node2 } if (node1P != null) node1P.next = node2; // what about the head and tail nodes? // update them accordingly } // why? 119/ 124 Singly-Linked List (SLL) void swap(Node node1, Node node2, Node node1P, Node node2P) { if (node1.next == node2) { // side-by-side (1st case) node1.next = node2.next; node2.next = node1; } // 2nd case else { Node temp = node1.next; node1.next = node2.next; node2.next = temp; node2P.next = node1; // the node before node2 } if (node1P != null) node1P.next = node2; // what about the head and tail nodes? // update them accordingly } // why? 120/ 124 Singly-Linked List (SLL) void swap(Node node1, Node node2, Node node1P, Node node2P) { if (node1.next == node2) { // side-by-side (1st case) node1.next = node2.next; node2.next = node1; } // 2nd case else { Node temp = node1.next; node1.next = node2.next; node2.next = temp; node2P.next = node1; // the node before node2 } if (node1P != null) node1P.next = node2; // what about the head and tail nodes? // update them accordingly } // why? 121/ 124 Singly-Linked List (SLL) Sorting: So swap is not straightforward 122/ 124 Singly-Linked List (SLL) Sorting: So swap is not straightforward Once you figure out swap, you can implement Bubble and Selection Sort 123/ 124 Singly-Linked List (SLL) Sorting: So swap is not straightforward Once you figure out swap, you can implement Bubble and Selection Sort Try to implement the Sorting Methods for Linked Lists 124/ 124 Summary Arrays/ArrayLists: useful data structures but not always optimal. Retrieval very quick, insertion can be slow Stacks/Queues: Abstract data types useful for LIFO/FIFO storage. Implemented using arrays/SLLs Linked Lists: Alternative to arrays – insertion is fast but retrieval is slow.