Skip to content

Commit 2e8727d

Browse files
committed
linked_list_implemented
1 parent cf9e042 commit 2e8727d

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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

0 commit comments

Comments
 (0)