Download presentation
Presentation is loading. Please wait.
1
Linked List Implementation of the Deque
CS261 Data Structures Linked List Implementation of the Deque
2
Deque Interface (Review)
int isEmpty(); void addFront(TYPE val); // Add value at front of deque. void addBack (TYPE val); // Add value at back of deque. void removeFront(); // Remove value at front. void removeBack (); // Remove value at back. TYPE front(); // Get value at front of deque. TYPE back(); // Get value at back of deque.
3
Linked List Deque What if we want to add and remove elements from both front and back? tail List head link link link Right side is the ‘back’ of our queue ….remember why! Try to remove from the back…what was the problem? How can we fix that? DOUBLE LINKS! val links … head tail
4
Modification #3: Double Links
prev Point forward to the next element Point backwards to the previous element struct DLink { TYPE val; struct DLink *next; /* Link to prev node. */ struct DLink *prev; /* Link to next node. */ }; Link next lastLink List firstLink prev prev prev prev Link Link … Link next next next next
5
linkedListDeque Struct
struct linkedList { int size; struct dlink * frontSentinel; struct dlink * backSentinel; }; Why make front/back pointers? Makes the notation more consistent in that they’ll be treated like the others…ie. lnk->next and won’t need to check for special case and do lnk.next should write the code by hand! – do the init?
6
linkedListDequeInit void LinkedListInit (struct linkedList *q) {
q->frontSentinel = malloc(sizeof(struct dlink)); assert(q->frontSentinel != 0); q->backSentinel = malloc(sizeof(struct dlink)); assert(q->backSentinel); q->frontSentinel->next = q->backSentinel; q->backSentinel->prev = q->frontSentinal; q->size = 0; } backSent List frontSent prev next Sentinel Sentinel
7
Advantage of Sentinels
Consider a deque, with two sentinels: Pointer to front sentinel: frontSent Pointer to back sentinel: backSent Add to front and add to back are now special cases of more general “add before” operation This is similar to most standard library Deque implementations (Java LinkedList) AddBefore(nodeB, X) We ALWAYS have a front and back. A B A X B
8
Advantage of Sentinels
Consider a deque, with two sentinels: Pointer to front sentinel: frontSent Pointer to back sentinel: backSent Add to front and add to back are now special cases of more general “add before” operation This is similar to most standard library Deque implementations (Java LinkedList) We ALWAYS have a front and back. backSent List frontSent prev prev prev prev Link … Link next next next next
9
Adding to the LL Deque void addBackListDeque(struct ListDeque *q,TYPE val) { _addBefore(q->backSent, val); } void addFrontListDeque(struct ListDeque *q,TYPE val) { _addBefore(q->frontSent->next, val); backSent List frontSent prev prev prev prev prev Link … Link next next next next next
10
Removing from the LL Deque
void removeFirstListDeque(struct ListDeque *q) { assert(!isEmptyListDeque(q)); _removeLink(q->frontSent->next); } void removeLastListDeque(struct ListDeque *q) { _removeLink (q->backSent->prev); backSent List frontSent prev prev prev prev prev Link … Link next next next next next
11
Your Turn… Worksheet #19: _addBefore, _removeLink DynArrDeque
best, ave, worst LLDeque addLast O(1),O(1+), O(N) O(1),O(1),O(1) removeLast O(1), O(1),O(1) addFirst removeFirst
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.