From f27a1aa7f3ab6107d255a629edbd9bb49325c528 Mon Sep 17 00:00:00 2001 From: shreefAhmedM Date: Wed, 14 Oct 2026 15:52:52 +0100 Subject: [PATCH 1/2] Implement a linked list data structure in Python --- Sprint-2/implement_linked_list/linked_list.py | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index e69de29b..6ca8c991 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -0,0 +1,66 @@ +class Node: + def __init__(self, value): + self.value = value + self.next = None + self.previous = None + + +class LinkedList: + def __init__(self): + self.head = None + self.tail = None + + def push_head(self, item): + new_node = Node(item) + + if not self.head: + self.head = new_node + self.tail = new_node + else: + new_node.next = self.head + self.head.previous = new_node + self.head = new_node + + return new_node + + def pop_tail(self): + if not self.tail: + return None + + popped_node = self.tail + value = popped_node.value + + if self.head == self.tail: + self.head = None + self.tail = None + else: + self.tail = self.tail.previous + self.tail.next = None + + popped_node.previous = None + return value + + def remove(self, node: Node): + if not node: + return + + if node == self.head: + self.head = node.next + if self.head: + self.head.previous = None + else: + self.tail = None + + elif node == self.tail: + self.tail = node.previous + if self.tail: + self.tail.next = None + else: + self.head = None + + else: + node.previous.next = node.next + node.next.previous = node.previous + + node.next = None + node.previous = None \ No newline at end of file From 8f16dc41fec4dd261edb724daf82639d0995d6b1 Mon Sep 17 00:00:00 2001 From: shreefAhmedM Date: Fri, 16 Oct 2026 16:41:47 +0100 Subject: [PATCH 2/2] Optimize linked list memory and simplify tail removal --- Sprint-2/implement_linked_list/linked_list.py | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index 6ca8c991..5ce66e2d 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -1,4 +1,6 @@ class Node: + __slots__ = ("value", "next", "previous") + def __init__(self, value): self.value = value self.next = None @@ -12,7 +14,7 @@ def __init__(self): def push_head(self, item): new_node = Node(item) - + if not self.head: self.head = new_node self.tail = new_node @@ -20,24 +22,18 @@ def push_head(self, item): new_node.next = self.head self.head.previous = new_node self.head = new_node - + return new_node def pop_tail(self): if not self.tail: - return None - + return None + popped_node = self.tail value = popped_node.value - - if self.head == self.tail: - self.head = None - self.tail = None - else: - self.tail = self.tail.previous - self.tail.next = None - - popped_node.previous = None + + self.remove(popped_node) + return value def remove(self, node: Node): @@ -49,15 +45,15 @@ def remove(self, node: Node): if self.head: self.head.previous = None else: - self.tail = None - + self.tail = None + elif node == self.tail: self.tail = node.previous if self.tail: self.tail.next = None else: - self.head = None - + self.head = None + else: node.previous.next = node.next node.next.previous = node.previous