From 936d663e34c04b80454e35ae1aa8ccbc38e84afa Mon Sep 17 00:00:00 2001 From: sheida-shab Date: Sun, 15 Feb 2026 14:56:33 +0000 Subject: [PATCH 1/7] Add Node and LinkedList skeleton --- Sprint-2/implement_linked_list/linked_list.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index e69de29..b288808 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -0,0 +1,24 @@ +class Node: + """ + Represents a node in a doubly linked list. + Each node holds a value and references to the previous and next nodes. + """ + def __init__(self,value): + self.value=value + self.next=None + self.previous=None + +class LinkedList: + """ + A doubly linked list supporting push_head, pop_tail, and remove operations. + Maintains references to both head and tail nodes for O(1) operations. + """ + def __init__(self): + self.head=None + self.tail=None + def push_head(self,value) -> Node: + pass + def pop_tail(self) -> any: + pass + def remove(self,node) -> None: + pass From 4a27d51cf4c1f0ec7c37e4c9b0fec6acc33f9d53 Mon Sep 17 00:00:00 2001 From: sheida-shab Date: Sun, 15 Feb 2026 18:35:37 +0000 Subject: [PATCH 2/7] Implement push_head method --- Sprint-2/implement_linked_list/linked_list.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index b288808..f9a7373 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -17,8 +17,19 @@ def __init__(self): self.head=None self.tail=None def push_head(self,value) -> Node: - pass + new_node=Node(value) + if self.head is None: + self.head=new_node + self.tail=new_node + else: + old_head=self.head + self.head=new_node + new_node.next=old_head + old_head.previous=new_node + return new_node + def pop_tail(self) -> any: pass def remove(self,node) -> None: pass + From 110d31f48a4b5f91307378a59205b21d5c0317db Mon Sep 17 00:00:00 2001 From: sheida-shab Date: Sun, 15 Feb 2026 18:50:30 +0000 Subject: [PATCH 3/7] Implement pop_tail method --- Sprint-2/implement_linked_list/linked_list.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index f9a7373..ea8e121 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -29,7 +29,18 @@ def push_head(self,value) -> Node: return new_node def pop_tail(self) -> any: - pass + if self.head is None: + return None + elif self.head==self.tail: + node_value=self.head.value + self.head=None + self.tail=None + else: + node_value=self.tail.value + previous_node=self.tail.previous + self.tail=previous_node + return node_value + def remove(self,node) -> None: pass From 8e8fd4389a34193e9d48b9f1ee1f93a733deea14 Mon Sep 17 00:00:00 2001 From: sheida-shab Date: Sun, 15 Feb 2026 19:24:00 +0000 Subject: [PATCH 4/7] Implement remove method --- Sprint-2/implement_linked_list/linked_list.py | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index ea8e121..b6093fa 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -42,5 +42,28 @@ def pop_tail(self) -> any: return node_value def remove(self,node) -> None: - pass + node_to_remove=node + current_head=self.head + current_tail=self.tail + if current_head==current_tail: + #linkedlist has only one node + self.head=None + self.tail=None + elif node_to_remove.next is None: + #Node is the last node(tail) + self.tail=node_to_remove.previous + self.tail.next=None + elif node_to_remove.previous is None: + #Node is the first node(head) + self.head=node_to_remove.next + self.head.previous=None + else: + #Node is in the middle of list + previous_node=node_to_remove.previous + next_node=node_to_remove.next + previous_node.next=next_node + next_node.previous=previous_node + + node_to_remove.next=None + node_to_remove.previous=None From 263e13c29cd8324b2e5019ec55c0ec617e5b5181 Mon Sep 17 00:00:00 2001 From: sheida-shab Date: Fri, 27 Feb 2026 22:10:54 +0000 Subject: [PATCH 5/7] Refactor pop_tail: use remove() for tail and clear its references --- Sprint-2/implement_linked_list/linked_list.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index b6093fa..c8dfa96 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -32,13 +32,14 @@ def pop_tail(self) -> any: if self.head is None: return None elif self.head==self.tail: - node_value=self.head.value - self.head=None - self.tail=None + node_to_remove = self.head + node_value = node_to_remove.value + self.remove(node_to_remove) + else: - node_value=self.tail.value - previous_node=self.tail.previous - self.tail=previous_node + node_to_remove = self.tail + node_value = node_to_remove.value + self.remove(node_to_remove) return node_value def remove(self,node) -> None: @@ -64,6 +65,5 @@ def remove(self,node) -> None: previous_node.next=next_node next_node.previous=previous_node - node_to_remove.next=None - node_to_remove.previous=None + From 08046f8e68d003d072736227023f1eeeb9479dd4 Mon Sep 17 00:00:00 2001 From: sheida-shab Date: Sat, 28 Feb 2026 11:53:21 +0000 Subject: [PATCH 6/7] Refactor LinkedList: simplify pop_tail and restore node detachment in remove --- Sprint-2/implement_linked_list/linked_list.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index c8dfa96..ffd913d 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -31,15 +31,8 @@ def push_head(self,value) -> Node: def pop_tail(self) -> any: if self.head is None: return None - elif self.head==self.tail: - node_to_remove = self.head - node_value = node_to_remove.value - self.remove(node_to_remove) - - else: - node_to_remove = self.tail - node_value = node_to_remove.value - self.remove(node_to_remove) + node_value = self.tail.value + self.remove(self.tail) return node_value def remove(self,node) -> None: From d81130c01aa2136c6b250359f4bb19d81e7b8f93 Mon Sep 17 00:00:00 2001 From: sheida-shab Date: Sat, 28 Feb 2026 17:36:59 +0000 Subject: [PATCH 7/7] Add code for clearing references in remove() --- Sprint-2/implement_linked_list/linked_list.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index ffd913d..08d9bcf 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -57,6 +57,9 @@ def remove(self,node) -> None: next_node=node_to_remove.next previous_node.next=next_node next_node.previous=previous_node + + node_to_remove.next=None + node_to_remove.previous=None