Skip to content

Commit 602505d

Browse files
Implement doubly-linked list with O(1) operations
1 parent de683df commit 602505d

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
class Node:
2+
def __init__(self, value):
3+
self.value = value
4+
self.next = None
5+
self.previous = None
6+
7+
8+
class LinkedList:
9+
def __init__(self):
10+
self.head = None
11+
self.tail = None
12+
13+
def push_head(self, value):
14+
new_node = Node(value)
15+
16+
if self.head is None:
17+
self.head = new_node
18+
self.tail = new_node
19+
else:
20+
new_node.next = self.head
21+
self.head.previous = new_node
22+
self.head = new_node
23+
24+
return new_node
25+
26+
def pop_tail(self):
27+
28+
if self.tail is None:
29+
raise IndexError("pop_tail from empty linked list")
30+
31+
value = self.tail.value
32+
33+
if self.head == self.tail:
34+
self.head = None
35+
self.tail = None
36+
else:
37+
self.tail = self.tail.previous
38+
self.tail.next = None
39+
40+
return value
41+
42+
def remove(self, node):
43+
if node is None:
44+
raise ValueError("Cannot remove None node")
45+
46+
if node == self.head == self.tail:
47+
self.head = None
48+
self.tail = None
49+
elif node == self.head:
50+
self.head = node.next
51+
self.head.previous = None
52+
elif node == self.tail:
53+
self.tail = node.previous
54+
self.tail.next = None
55+
else:
56+
node.previous.next = node.next
57+
node.next.previous = node.previous

0 commit comments

Comments
 (0)