Doubly Linked List
Doubly Linked List
Motivation
Doubly linked lists are useful for playing video
and sound files with “rewind” and instant
“replay”
They are also useful for other linked data
where “require” a “fast forward” of the data as
needed
Doubly Linked Lists / Slide 3
10 20 40 55 70
Head
Cur->prev Cur Cur->next
Doubly Linked List Definition
struct Node{
int data;
Node* next;
Node* prev;
};
typedef Node* NodePtr;
Doubly Linked Lists / Slide 6
Deleting a Node
Delete a node Cur (not at front or rear)
(Cur->prev)->next = Cur->next;
(Cur->next)->prev = Cur->prev;
delete Cur;
10 20 40 55 70
Head
Cur
Doubly Linked Lists / Slide 8
if (head==NULL) { …
} Empty case
else if (cur->prev == NULL) { …
}
else if (cur->next==NULL) { … At-the-beginning case
}
else { At-the-end case
(cur->prev)->next = cur->next;
General
(cur->next)->prev = cur->prev; case
delete cur;
}
}
A systematic way is to start from all these cases, then try to simply the codes, …
Doubly Linked Lists / Slide 9
Inserting a Node
Insert a node New before Cur (not at front or
rear)
New->next = Cur;
New->prev = Cur->prev;
Cur->prev = New;
(New->prev)->next = New;
10 20 55 70
Head 40
Cur
New
Doubly Linked Lists / Slide 10
if (head==NULL) { …
}
else if (cur->prev == NULL) { …
}
else if (cur->next==NULL) { …
}
else {
blablabla …
}
}
10 20 40 55 70
Rear
(regular) doubly linked list
10 20 40 55 70
Head
Dummy
10 20 40 55 70
Head
Doubly Linked Lists / Slide 13
10 20 40 55 70
Head
Doubly Linked Lists / Slide 15
Empty list:
Head
NodePtr head;
createHead(head);
NodePtr cur=head;
creation
NodePtr cur=head;
cur=cur->next;
cur=head;
cur=head; // dummy head
cur=NULL; // or head=NULL;
reference
Start from
Empty test
Print the whole list:
Deleting a Node
Delete a node Cur at front
(Cur->prev)->next = Cur->next;
(Cur->next)->prev = Cur->prev;
delete Cur;
10 20 40 55 70
Head Cur
Doubly Linked Lists / Slide 20
10 20 40 55 70
Cur
Head
Doubly Linked Lists / Slide 21
10 20 40 55 70
Head Cur
void deleteNode(NodePtr head, int item){
NodePtr cur;
cur = searchNode(head, item);
if(cur != NULL){
cur->prev->next = cur->next;
cur->next->prev = cur->prev;
delete cur;
}
}
Inserting a Node
Insert a Node New after dummy node and
before Cur
New->next = Cur;
New->prev = Cur->prev;
Cur->prev = New;
(New->prev)->next = New;
20
10
Head New Cur
Doubly Linked Lists / Slide 24
10 20 40 55 70
10 20 55
40
New Cur
Head
Doubly Linked Lists / Slide 26
20
cur = head->next;
location while ((cur != head)&&(!(item<=cur->data)))
cur = cur->next;
newp->next = cur;
newp->prev = cur->prev;
insertion cur->prev = newp;
(newp->prev)->next = newp;
}
createHead(Head);
insertNode(Head, 3); Result is
insertNode(Head, 5); 235
insertNode(Head, 2);
123578
print(Head);
insertNode(Head, 7); 12358
insertNode(Head, 1); Data is contained in the list
insertNode(Head, 8);
print(Head);
deleteNode(Head, 7);
deleteNode(Head, 0);
print(Head);
temp = searchNode(Head, 5);
if(temp !=NULL)
cout<<" Data is contained in the list"<<endl;
else
cout<<" Data is NOT contained in the list"<<endl;
}