Files
python/exercises/linked-list/example.py
Rootul Patel 96c06b44bd linked-list: Implement solution to extra-credit
- implement the __len__() and __iter__() methods
- the __len__() method has a bug in that it will incorrectly calculate
the length of a linked-list if `pop` or `shift` are called on an empty
linked-list. Fortunately the README states that:

> pop or shift will never be called on an empty list.
2017-01-28 01:18:44 +00:00

62 lines
1.6 KiB
Python

class Node(object):
def __init__(self, value, next=None, prev=None):
self.value = value
self.next = next
self.prev = prev
class LinkedList(object):
def __init__(self):
self.head = None
self.tail = None
self.length = 0
def push(self, value):
new_node = Node(value)
if not self.head:
self.head = self.tail = new_node
else:
new_node.prev = self.tail
self.tail.next = new_node
self.tail = new_node
self.length += 1
def pop(self):
node = self.tail
if node is None or node.prev is None:
self.head = self.tail = None
else:
self.tail = self.tail.prev
self.tail.next = None
self.length -= 1
return node.value
def shift(self):
node = self.head
if node is None or node.next is None:
self.head = self.tail = None
else:
self.head = self.head.next
self.head.prev = None
self.length -= 1
return node.value
def unshift(self, value):
new_node = Node(value)
if not self.head:
self.head = self.tail = new_node
else:
new_node.next = self.head
self.head.prev = new_node
self.head = new_node
self.length += 1
def __len__(self):
return self.length
def __iter__(self):
current_node = self.head
while (current_node):
yield current_node.value
current_node = current_node.next