Skip to content

Instantly share code, notes, and snippets.

@giuscri
Created August 3, 2017 16:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save giuscri/6ee4c1b519399461ee0d1f99a52bfee2 to your computer and use it in GitHub Desktop.
Save giuscri/6ee4c1b519399461ee0d1f99a52bfee2 to your computer and use it in GitHub Desktop.
Waiting for the train, linkedlist!
class Node:
def __init__(self, value, next_reference=None):
if not value.__hash__: hash(value)
self.value = value
self.next_reference = next_reference
class Linkedlist:
def __init__(self):
self.head = None
self.tail = None
def append(self, value):
node = Node(value)
if not self.head:
self.head = node
self.tail = self.head
return self
self.tail.next_reference = node
self.tail = self.tail.next_reference
return self
def remove(self, value):
if not self.head: return self
if self.head.value == value:
self.head = self.head.next_reference
return self
previous_node, current_node = self.head, self.head.next_reference
while current_node and current_node.value != value:
previous_node = current_node
current_node = current_node.next_reference
if not current_node: return self
previous_node.next_reference = current_node.next_reference
return self
def __str__(self):
return self._aslist().__str__()
def _aslist(self):
values = []
current_node = self.head
while current_node:
values.append(current_node.value)
current_node = current_node.next_reference
return values
def __eq__(self, other):
if not isinstance(other, list): return False
return self._aslist() == other
if __name__ == '__main__':
l = Linkedlist()
values = [9, 3, 30, 13, 6, 28]
for v in values: l.append(v)
assert l == values
for v in values: l.remove(v)
assert l == []
for v in values: l.append(v)
for v in values[:3]: l.remove(v)
assert l == [13, 6, 28]
l.remove(values[-1])
assert l == [13, 6]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment