File tree Expand file tree Collapse file tree 1 file changed +73
-0
lines changed
Sprint-2/implement_linked_list Expand file tree Collapse file tree 1 file changed +73
-0
lines changed Original file line number Diff line number Diff line change 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+ """Insert a new node at the head and return the node."""
15+ new_node = Node (value )
16+
17+ if self .head is None :
18+ # Empty list: head and tail are the same node
19+ self .head = new_node
20+ self .tail = new_node
21+ else :
22+ # Non‑empty: link new node before current head
23+ new_node .next = self .head
24+ self .head .previous = new_node
25+ self .head = new_node
26+
27+ return new_node
28+
29+ def pop_tail (self ):
30+ """Remove the tail node and return its value."""
31+ if self .tail is None :
32+ raise IndexError ("pop from empty linked list" )
33+
34+ node = self .tail
35+ value = node .value
36+
37+ # Move tail backwards
38+ self .tail = node .previous
39+
40+ if self .tail is None :
41+ # List is now empty
42+ self .head = None
43+ else :
44+ self .tail .next = None
45+
46+ # Fully detach the old node (good hygiene)
47+ node .next = None
48+ node .previous = None
49+
50+ return value
51+
52+ def remove (self , node ):
53+ """Remove an arbitrary node from the list."""
54+ if node is None :
55+ return
56+
57+ # Fix previous node's next pointer
58+ if node .previous is not None :
59+ node .previous .next = node .next
60+ else :
61+ # node was head
62+ self .head = node .next
63+
64+ # Fix next node's previous pointer
65+ if node .next is not None :
66+ node .next .previous = node .previous
67+ else :
68+ # node was tail
69+ self .tail = node .previous
70+
71+ # Detach removed node
72+ node .next = None
73+ node .previous = None
You can’t perform that action at this time.
0 commit comments