From f45f5ca0f47dbd02970f6601ec8e9af22188971f Mon Sep 17 00:00:00 2001 From: Emilianouz <135679131+Emilianouz@users.noreply.github.com> Date: Sat, 28 Feb 2026 11:20:31 +0000 Subject: [PATCH 1/2] LinkedList implementation with double linked list. --- Sprint-2/implement_linked_list/linked_list.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index e69de29..aa271bd 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -0,0 +1,59 @@ +# `push_head` should add an element to the start of the list. It should return something that can be passed to +# `remove` to remove that element in the future. +# `pop_tail` should remove an element from the end of the list. +# `remove` takes a handle from `push_head`, and removes that element from the list. + +class LinkedList: + class _Node: # to have O(1) must be implemented double linked list to access previous + __slots__ = ("value", "prev", "next") + + def __init__(self, value): + self.value = value + self.prev = None + self.next = None + + def __init__(self): + self.head = None + self.tail = None + + def push_head(self, value): + node = self._Node(value) + + node.next = self.head + if self.head: + self.head.prev = node + else: + # when list gets empty, tail also becomes this node + self.tail = node + + self.head = node + return node # handling + + def pop_tail(self): + if not self.tail: + raise IndexError("pop from empty list") + + node = self.tail + value = node.value + + self.tail = node.prev + if self.tail: + self.tail.next = None + else: + # when the list gets empty + self.head = None + + return value + + def remove(self, node): + if node.prev: + node.prev.next = node.next + else: + # removes head + self.head = node.next + + if node.next: + node.next.prev = node.prev + else: + # removes tail + self.tail = node.prev From 84c810f10ba927a34792e6c570edef5f8f44b316 Mon Sep 17 00:00:00 2001 From: Emilianouz <135679131+Emilianouz@users.noreply.github.com> Date: Sat, 28 Feb 2026 11:43:54 +0000 Subject: [PATCH 2/2] linked list --- Sprint-2/implement_linked_list/linked_list.py | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/Sprint-2/implement_linked_list/linked_list.py b/Sprint-2/implement_linked_list/linked_list.py index aa271bd..77d031a 100644 --- a/Sprint-2/implement_linked_list/linked_list.py +++ b/Sprint-2/implement_linked_list/linked_list.py @@ -3,57 +3,57 @@ # `pop_tail` should remove an element from the end of the list. # `remove` takes a handle from `push_head`, and removes that element from the list. -class LinkedList: - class _Node: # to have O(1) must be implemented double linked list to access previous - __slots__ = ("value", "prev", "next") +class Node: + def __init__(self, value): + self.value = value + self.prev = None + self.next = None - def __init__(self, value): - self.value = value - self.prev = None - self.next = None +class LinkedList: def __init__(self): - self.head = None - self.tail = None + self.head = None + self.tail = None + # adding a new value in the front of the list def push_head(self, value): - node = self._Node(value) + node = Node(value) - node.next = self.head - if self.head: - self.head.prev = node + if self.head is None: # if list is empty head and tail becomes this node. + self.head = node + self.tail = node else: - # when list gets empty, tail also becomes this node - self.tail = node + node.next = self.head + self.head.prev = node + self.head = node - self.head = node - return node # handling + return node # returns the node so we can remove it later + # removing last element def pop_tail(self): - if not self.tail: - raise IndexError("pop from empty list") + if self.tail is None: + raise Exception("List is empty") - node = self.tail - value = node.value + value = self.tail.value # value to return - self.tail = node.prev - if self.tail: - self.tail.next = None - else: - # when the list gets empty + if self.head == self.tail: # if only one element self.head = None + self.tail = None + else: + self.tail = self.tail.prev # move tail back + self.tail.next = None # remove old tail connection return value + # removes a specific node def remove(self, node): - if node.prev: - node.prev.next = node.next - else: - # removes head - self.head = node.next - if node.next: - node.next.prev = node.prev + if node.prev is None: # if removing head + self.head = node.next else: - # removes tail + node.prev.next = node.next # connect previous to next + + if node.next is None: # if removing tail self.tail = node.prev + else: + node.next.prev = node.prev # connect next to previous \ No newline at end of file