File tree Expand file tree Collapse file tree
Sprint-2/implement_linked_list Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments