chapter 17 linked list saurav karmakar spring 2007
TRANSCRIPT
LISTS Easiest implementation of LIST --- ARRAY
:: has Disadvantages.
1) To insert an item at the beginning or middle of an array sliding lots of items over one place to
make room :: ~ O(n)
2) Arrays have a fixed length :: can't be changed.
Adding items to a list Allocation a whole new array if the array containing LIST is full and then move all the items from the old array to the new one.
Linked List Consists of connected, dynamically
allocated nodes.
A linked list is made up of "nodes". Each node has two components: an item, and a reference to the next node in the list.
Comparison with Array1. Arrays
contiguousdirect access of elementsinsertion / deletion difficult
2. Linked Listsnoncontiguousmust scan for elementinsertion /deletion easy
1. Arrayscontiguousdirect access of elementsinsertion / deletion difficult
2. Linked Listsnoncontiguousmust scan for elementinsertion /deletion easy
arrayname
for (int i = 0; i < length; i++) cout<< a[i];
for (ListNode p = theList.first; p != null; p = p.next) cout<< p.data ;
for (int i = 0; i < length; i++) cout<< a[i];
for (ListNode p = theList.first; p != null; p = p.next) cout<< p.data ;
a
Iterating through the data structureIterating through the data structure
class ListNode{ Object data; ListNode* next;}
At any point, we can add a new last item x by doing this: Last->next = new ListNode();last = last->next;Last->data = x;Last->next = null;
A0 A1 A2
first last
Adding an element
class ListNode{ Object data; ListNode* next;}
At any point, we can add a new last item x by doing this: Last->next = new ListNode();last = last->next;Last->data = x;Last->next = null;
A0 A1 A2
first last
class ListNode{ Object data; ListNode* next;}
At any point, we can add a new last item x by doing this: last->next = new ListNode();last = last->next;Last->data = x;Last->next = null;
A0 A1 A2
first last
class ListNode{ Object data; ListNode* next;}
At any point, we can add a new last item x by doing this: last->next = new ListNode();last = last->next;Last->data = x;Last->next = null;
A0 A1 A2 x
first last
class ListNode{ Object data; ListNode* next;}
At any point, we can add a new last item x by doing this: Last->next = new ListNode();last = last->next;Last->data = x;Last->next = null;
A0 A1 A2 x
first last
class ListNode{ Object element; ListNode* next;}At any point, we can insert a new item x by doing this:tmp = new ListNode();Tmp->element = x;Tmp->next = current->next;Current->next = tmp;
last
Inserting an element
A0 A1 A2
first current
class ListNode{ Object element; ListNode* next;}At any point, we can insert a new item x by doing this:
tmp = new ListNode();Tmp->element = x;Tmp->next = current->next;Current->next = tmp;
Inserting an element
A0 A1 A2
first lastcurrent
tmp
class ListNode{ Object element; ListNode* next;}At any point, we can insert a new item x by doing this:
tmp = new ListNode();Tmp->element = x;Tmp->next = current->next;Current->next = tmp;
Inserting an element
A0 A1 A2
first lastcurrent x
tmp
class ListNode{ Object element; ListNode* next;}At any point, we can add a new last item x by doing this: tmp = new ListNode();Tmp->element = x;Tmp->next = current->next;current->next = tmp;
Inserting an element
A0 A1 A2
first lastcurrent x
tmp
class ListNode{ Object element; ListNode* next;}At any point, we can add a new last item x by doing this: tmp = new ListNode();Tmp->element = x;Tmp->next = current->next;Current->next = tmp;
Inserting an element
A0 A1 A2
first lastcurrent x
tmp
Simplified version
Current->next = new ListNode(x, current->next)
tmp = new ListNode();
Current->next = tmp;
Tmp->next = current->next;
Tmp->element = x;
class ListNode{ Object element; ListNode* next;}
Current->next = current->next->next;
Deleting an element
A0 A1 A2
current last
class ListNode{ Object element; ListNode* next;}
Current->next = current->next->next; Memory leak!
Deleting an element
A0 A1 A2
lastcurrent
Delete a Node
Node *deletedNode = current->next;
Current->next = current->next->next;
Delete deletedNode;
Length Function The Length function takes a linked list and
computes the number of elements in the list.
/*Given a linked list head pointer, compute and return the number of nodes in the list.*/
int Length(struct node* head) {struct node* current = head;int count = 0;while (current != NULL) {count++;current = current->next;}return count;}
a b c
header
Header nodes allow us to avoid special cases [in the code] such as insertion of the first element and removal of the last element.
The header node holds no data but serves to satisfy the requirement that every node have a previous node.
Not necessarily a standard implementation.
Header node
a b c
head tail
class DoubleListNode{ Object element; ListNode* next; ListNode* prev;}
class DoubleListNode{ Object element; ListNode* next; ListNode* prev;}
A doubly linked list allows bidirectional traversal by storing two pointers per node.
Doubly Linked Lists
head tail// constructorDoubleList(){ head = new DoubleListNode (); tail = new DoubleListNode (); head->next = tail; tail->prev = head;}
Empty Doubly Linked List
newNode = new DoublyLinkedListNode()newNode->prev = current;newNode->next = current->next;newNode->prev->next = newNode;newNode->next->prev = newNode;current = newNode
Inserting into a Doubly Linked List
a c
head tailcurrent
Inserting into a Doubly Linked List
a c
head tail
newNode = new DoublyLinkedListNode()newNode->prev = current;newNode->next = current->next;newNode->prev->next = newNode;newNode->next->prev = newNode;current = newNode
bcurrent
Inserting into a Doubly Linked List
a c
head tail
newNode = new DoublyLinkedListNode()newNode->prev = current;newNode->next = current->next;newNode->prev->next = newNode;newNode->next->prev = newNode;current = newNode
bcurrent
Inserting into a Doubly Linked List
a c
head tail
newNode = new DoublyLinkedListNode()newNode->prev = current;newNode->next = current->next;newNode->prev->next = newNode;newNode->next->prev = newNode;current = newNode
bcurrent
newNode = new DoublyLinkedListNode()newNode->prev = current;newNode->next = current->next;newNode->prev->next = newNode;newNode->next->prev = newNode;current = newNode
Inserting into a Doubly Linked List
a c
head tailbcurrent
newNode = new DoublyLinkedListNode()newNode->prev = current;newNode->next = current->next;newNode->prev->next = newNode;newNode->next->prev = newNode;current = newNode
Inserting into a Doubly Linked List
a c
head tailbcurrent
newNode = new DoublyLinkedListNode()newNode->prev = current;newNode->next = current->next;newNode->prev->next = newNode;newNode->next->prev = newNode;current = newNode
Inserting into a Doubly Linked List
a c
head tailbcurrent