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
58 changes: 58 additions & 0 deletions Sprint-2/implement_linked_list/linked_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
class Node:
def __init__(self, value):
self.value = value
self.previous = None
self.next = None


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

def push_head(self, element):
node = Node(element)
if self.head:
node.next = self.head
self.head.previous = self.head = node
else:
self.head = node
self.tail = node
return node

def pop_tail(self):
# get current tail
node = self.tail
if self.tail is not self.head:
# replace the tail
self.tail = node.previous
# reset to none
self.tail.next = node.previous = None
else:
self.head = None
self.tail = None
node.previous = None
node.next = None
return node.value

def remove(self, node):
if self.head == node:
if self.tail == node:
# head == node, tail == node
self.head = self.tail = None
node.previous = None
node.next = None
else:
# head == node, tail != node
self.head = node.next
self.head.previous = node.next = None
else:
if self.tail == node:
# head != node, tail == node
self.tail = node.previous
self.tail.next = node.previous = None
else:
# head != node, tail != node
node.previous.next = node.next
node.next.previous = node.previous
node.previous = node.next = None
27 changes: 27 additions & 0 deletions Sprint-2/implement_linked_list/linked_list_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from linked_list import LinkedList


class LinkedListTest(unittest.TestCase):
def test_pushes_then_pops(self):
l = LinkedList()
Expand Down Expand Up @@ -34,6 +35,32 @@ def test_remove_tail(self):
self.assertIsNone(b.next)
self.assertIsNone(b.previous)

def test_remove_last(self):
l = LinkedList()
a = l.push_head("a")
b = l.push_head("b")
l.remove(a)
l.remove(b)
self.assertIsNone(a.next)
self.assertIsNone(a.previous)
self.assertIsNone(b.next)
self.assertIsNone(b.previous)
self.assertIsNone(l.head)
self.assertIsNone(l.tail)

def test_pop_last_tail(self):
l = LinkedList()
a = l.push_head("a")
b = l.push_head("b")
c = l.push_head("c")
l.remove(a)
l.remove(c)
l.pop_tail()
self.assertIsNone(b.next)
self.assertIsNone(b.previous)
self.assertIsNone(l.head)
self.assertIsNone(l.tail)


if __name__ == "__main__":
unittest.main()