Skip to content

Instantly share code, notes, and snippets.

@DuskyElf
Last active October 24, 2022 07:51
Show Gist options
  • Select an option

  • Save DuskyElf/8c2e3cb14f91446f6e34bf40b1627110 to your computer and use it in GitHub Desktop.

Select an option

Save DuskyElf/8c2e3cb14f91446f6e34bf40b1627110 to your computer and use it in GitHub Desktop.
Simple implementation of Linked List in python
class Node:
def __init__(self, value, prev=None, next=None):
self.value = value
self.prev = prev
self.next = next
def __repr__(self):
return f"Node({self.value})"
class LinkedList:
def __init__(self, *values):
self.head = None
self.tail = None
self.size = 0
for value in values:
self.push_back(value)
def __len__(self):
return self.size
def __str__(self):
result = '['
if self.head:
result += str(self.head.value)
node = self.head
while node.next:
node = node.next
result += ", " + str(node.value)
result += ']'
return result
def is_empty(self):
return self.size == 0
def push_back(self, value):
new_node = Node(value)
if self.tail is None:
self.head = new_node
self.tail = new_node
else:
self.tail.next = new_node
new_node.prev = self.tail
self.tail = new_node
self.size += 1
def push_front(self, value):
new_node = Node(value)
if self.head is None:
self.head = new_node
self.tail = new_node
else:
self.head.prev = new_node
new_node.next = self.head
self.head = new_node
self.size += 1
def pop_back(self):
if self.tail is None:
return
value = self.tail.value
self.tail = self.tail.prev
if self.tail is None:
self.head = None
else:
self.tail.next = None
self.size -= 1
return value
def pop_front(self):
if self.head is None:
return
value = self.head.value
self.head = self.head.next
if self.head is None:
self.tail = None
else:
self.head.prev = None
self.size -= 1
return value
def peek_back(self):
if self.tail:
return self.tail.value
def peek_front(self):
if self.head:
return self.head.value
def find(self, value):
if self.head:
index = 0
node = self.head
while node:
if node.value == value:
return index
node = node.next
index += 1
def get_from_left(self, index):
i = 0
node = self.head
result = node
while node and i < index:
result = node
node = node.next
i += 1
return result
def get_from_right(self, index):
i = self.size
node = self.tail
result = node
while node and i > index:
result = node
node = node.prev
i -= 1
return result
def get_node(self, index):
if index < 0:
index = self.size + index
if index >= self.size:
raise IndexError
if index + 1 > self.size / 2:
return self.get_from_right(index)
return self.get_from_left(index)
def pop_at(self, index):
node = self.get_node(index)
if node is self.head:
return self.pop_front()
if node is self.tail:
return self.pop_back()
value = None
if node and node.prev and node.next:
node.prev.next = node.next
node.next.prev = node.prev
value = node.value
node = None
self.size -= 1
return value
def extend(self, other):
if self.tail is None:
self.head = other.head
self.tail = other.tail
else:
self.tail.next = other.head
self.tail = other.tail
self.size += other.size
def test():
first_list = LinkedList()
first_list.push_back(69)
first_list.push_back(420)
first_list.push_back(4)
first_list.push_front(4)
print(first_list)
print(first_list.pop_front())
print(first_list)
print(first_list.pop_back())
print(first_list)
second_list = LinkedList(6, 9, 4, 2, 0)
first_list.extend(second_list)
print(first_list)
print(first_list.pop_at(5))
print(first_list.pop_at(-4))
print(first_list)
print(first_list.find(9))
print(len(first_list))
if __name__ == "__main__":
test()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment