Skip to content

Commit 819a6a2

Browse files
committed
implement_linked_list
1 parent e718fb4 commit 819a6a2

1 file changed

Lines changed: 47 additions & 0 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
class Node:
2+
__slots__ = ("value", "previous", "next")
3+
4+
def __init__(self, value):
5+
self.value = value
6+
self.previous: "Node | None" = None
7+
self.next: "Node | None" = None
8+
9+
10+
class LinkedList:
11+
def __init__(self):
12+
self.head: Node | None = None
13+
self.tail: Node | None = None
14+
15+
def push_head(self, value) -> Node:
16+
"""Add a value to the front of the list. Returns a handle for O(1) removal."""
17+
node = Node(value)
18+
if self.head is None:
19+
self.head = self.tail = node
20+
else:
21+
node.next = self.head
22+
self.head.previous = node
23+
self.head = node
24+
return node
25+
26+
def pop_tail(self):
27+
"""Remove and return the value at the end of the list."""
28+
if self.tail is None:
29+
raise IndexError("pop from empty list")
30+
node = self.tail
31+
self.remove(node)
32+
return node.value
33+
34+
def remove(self, node: Node) -> None:
35+
"""Remove a node from the list in O(1) using a handle from push_head"""
36+
if node.previous is not None:
37+
node.previous.next = node.next
38+
else:
39+
self.head = node.next
40+
41+
if node.next is not None:
42+
node.next.previous = node.previous
43+
else:
44+
self.tail = node.previous
45+
46+
node.previous = None
47+
node.next = None

0 commit comments

Comments
 (0)