Skip to content
Open
Changes from 2 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
59 changes: 59 additions & 0 deletions Sprint-2/implement_linked_list/linked_list.py
Original file line number Diff line number Diff line change
@@ -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 Node:
def __init__(self, value):
self.value = value
self.prev = None
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

The tests in the linked_list_test.py expect the properties named in certain way.

self.next = None


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

# adding a new value in the front of the list
def push_head(self, value):
node = Node(value)

if self.head is None: # if list is empty head and tail becomes this node.
self.head = node
self.tail = node
else:
node.next = self.head
self.head.prev = node
self.head = node

return node # returns the node so we can remove it later

# removing last element
def pop_tail(self):
if self.tail is None:
raise Exception("List is empty")

value = self.tail.value # value to return

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
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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


return value

# removes a specific node
def remove(self, node):

if node.prev is None: # if removing head
self.head = node.next
else:
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