Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions Sprint-2/implement_linked_list/linked_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
class Node: #A node in a doubly linked list
def __init__(self, value): #Initialize a new node with the given value and no next or previous nodes
self.value = value
self.previous = None
self.next = None


class LinkedList: # A doubly linked list data structure
def __init__(self): # Initialize an empty linked list with no head node
self.head = None
self.tail = None

def push_head(self, value): # Add a new node with the given value to the head of the list
new_node = Node(value) # Create a new node with the given value

new_node.next = self.head # Set the new node's next pointer to the current head of the list
if self.head: # If the list is not empty, set the current head's previous pointer to the new node
self.head.previous = new_node
else:
self.tail = new_node

self.head = new_node # Update the head of the list to be the new node
return new_node # Return node for O(1) removal later

def remove(self, node): # Remove the given node from the list
if node.previous:
node.previous.next = node.next
else:
# Removing head
self.head = node.next

if node.next:
node.next.previous = node.previous
else:
# Removing tail
self.tail = node.previous

# Clean up references
node.previous = None
node.next = None

def pop_tail(self):
if not self.tail:
return None

old_tail = self.tail
value = old_tail.value

self.remove(old_tail) # handles pointer updates + cleanup

Comment on lines +48 to +50
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Why not also clean up references in this method?

  • Could consider delegating the node removing task to remove() -- less code to maintain.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Delegating to remove() would definitely reduce duplication and keep the logic in one place. It would make the implementation cleaner and easier to maintain, since any changes to the removal logic would only need to be made in a single method.
Delegating to remove(old_tail) does include the cleanup references because remove() method already does this

return value


1 change: 0 additions & 1 deletion Sprint-2/implement_linked_list/linked_list_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import unittest

from linked_list import LinkedList

class LinkedListTest(unittest.TestCase):
Expand Down