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
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.DS_Store
node_modules
.venv
venv
__pycache__
65 changes: 65 additions & 0 deletions Sprint-2/implement_linked_list/linked_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
class LinkedList:
class Node:
def __init__(self, value):
self.value = value
self.next = None
self.previous = None

def __init__(self):
self.head = None
self.tail = None

def push_head(self, value):
"""Add an element to the start of the list. Returns a handle to the node."""
new_node = self.Node(value)

if self.head is None:
# List is empty
self.head = new_node
self.tail = new_node
else:
# Add to front
new_node.next = self.head
self.head.previous = new_node
self.head = new_node

return new_node

def pop_tail(self):
"""Remove and return the element from the end of the list."""
if self.tail is None:
raise IndexError("pop from empty list")

value = self.tail.value

if self.head == self.tail:
# Only one element
self.head = None
self.tail = None
else:
# Multiple elements
self.tail = self.tail.previous
self.tail.next = None

return value

def remove(self, node):
"""Remove a specific node from the list using the handle from push_head."""
if node is None:
return

if node.previous is not None:
node.previous.next = node.next
else:
# node is head
self.head = node.next

if node.next is not None:
node.next.previous = node.previous
else:
# node is tail
self.tail = node.previous

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