DSAverse
Basics & Data Structures
Loading Data Structures...
Array Access
12
05
18
23
317
49
5array[0..5]indexed access
Array
Stack
Queue
Initializing Sorting Algorithms...
Sorting
Trees
Graphs
Preparing interactive visualizations...
Basics & Data Structures
Loading Data Structures...
Array Access
Array
Stack
Queue
Each node stores both a prev and a next pointer. Traverse in either direction and delete any node in O(1) given a pointer to it.
Each node has a ← prev and a next → pointer. HEAD.prev = NULL, TAIL.next = NULL.
Color Legend
Insert at head/tail/index, delete, search, or traverse backward to begin.
*O(1) delete requires a pointer to the node; traversal to find it is O(n).
What is the time complexity of deleting a node when you already have a direct pointer to it in a doubly linked list?
class Node:
def __init__(self, value):
self.value = value
self.prev = None
self.next = None
class DoublyLinkedList:
def __init__(self):
self.head = None
self.tail = None
self.size = 0
def insert_head(self, value): # O(1)
node = Node(value)
if not self.head:
self.head = self.tail = node
else:
node.next = self.head
self.head.prev = node
self.head = node
self.size += 1
def insert_tail(self, value): # O(1)
node = Node(value)
if not self.tail:
self.head = self.tail = node
else:
self.tail.next = node
node.prev = self.tail
self.tail = node
self.size += 1
def insert_at(self, index, value): # O(n) traverse
if index == 0:
self.insert_head(value); return
if index == self.size:
self.insert_tail(value); return
node = Node(value)
cur = self.head
for _ in range(index - 1):
cur = cur.next
node.prev, node.next = cur, cur.next # 4 pointer updates
cur.next.prev = node
cur.next = node
self.size += 1
def delete(self, index): # O(n) traverse, O(1) unlink
cur = self.head
for _ in range(index):
cur = cur.next
if cur.prev: cur.prev.next = cur.next
else: self.head = cur.next
if cur.next: cur.next.prev = cur.prev
else: self.tail = cur.prev
self.size -= 1
return cur.value
def traverse_backward(self): # O(n)
cur = self.tail
while cur:
yield cur.value
cur = cur.prev