Doubly-Linked Lists
Doubly-Linked Lists
Lists
Dr Zeinab Eid
Dr Zeinab Eid
prev
next
elem
node
elements
Dr Zeinab Eid 4
Sentinel Nodes
To simplify programming, two special nodes have been added at both ends of the doubly-linked list. Head and tail are dummy nodes, also called sentinels, do not store any data elements. Head: header sentinel has a null-prev reference (link). Tail: trailer sentinel has a null-next reference (link).
Dr Zeinab Eid 5
What we see from a Douby-linked List? A doubly-linked list object would need to store the following: 1. Reference to sentinel head-node;
Empty Doubly-Linked List: Using sentinels, we have no nulllinks; instead, we have: head.next = tail tail.prev = head Singl Node List: Size = 1
first last
header
trailer
header
trailer
This single node is the first node, and also is the last node:
first node is head.next
3. RemoveLast Algorithm
Notice that before removal, we must check for empty list. If not, we will remove the last node in the list, as shown in Figure above.
Dr Zeinab Eid 10
Algorithm removeLast()
If size = 0 then output error else { T tail.prev y T.data T.prev.next tail tail.prev T.prev delete(T) {garbage collector} size-return y }
This algorithm is valid also in case of a single node, size=1, in which case well get an empty list. Algorithm is one statement.
Dr Zeinab Eid 11
Insertion
We visualize operation AddAfter(p, X), which returns position q
p
A p A p A
Dr Zeinab Eid
B X q B X
C
12
Insertion Algorithm
Algorithm insertAfter(p,e): Create a new node v v.setElement(e) v.setPrev(p) {link v to its predecessor} v.setNext(p.getNext()) {link v to its successor} (p.getNext()).setPrev(v) {link ps old successor to v} p.setNext(v) {link p to its new successor, v} return v {the position for the element e}
Dr Zeinab Eid
13
Deletion
We visualize remove(p), where p = last()
p C C D
A A
B B
D
A
Dr Zeinab Eid
C
14
Deletion Algorithm
Algorithm remove(p): t = p.element {a temporary variable to hold the return value} (p.getPrev()).setNext(p.getNext()) {linking out p} (p.getNext()).setPrev(p.getPrev()) p.setPrev(null) {invalidating the position p} p.setNext(null) return t
Dr Zeinab Eid
15
Performance
In the implementation of the List ADT by means of a doubly linked list
The space used by a list with n elements is O(n) The space used by each position of the list is O(1) All the operations of the List ADT run in O(1) time Operation element() of the Position ADT runs in O(1) time
Dr Zeinab Eid 16