Skip to content

Instantly share code, notes, and snippets.

@mwrites
Last active September 10, 2021 06:53
Show Gist options
  • Save mwrites/0639f02443d9a98bd97e17a61523896a to your computer and use it in GitHub Desktop.
Save mwrites/0639f02443d9a98bd97e17a61523896a to your computer and use it in GitHub Desktop.
Python - LinkedList
# ******* Structures
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
# ******* Traversal
def __iter__(self):
node = self.head
while node:
yield node
node = node.next
def __len__(self):
i = 0
for node in self:
i += 1
return i
# ******* Insertion
# Append
def append(self, new_node):
if not self.head:
self.head = new_node
return
for node in self:
if not node.next:
node.next = new_node
# Prepend
def preprend(self, new_node):
new_node.next = self.head
self.head = new_node
# Insert After Node
def insert_after(self, prev_node, new_node):
if not prev_node:
raise Exception('prev_node is nil')
new_node.next = prev_node.next
prev_node.next = new_node
# Insert Before Node
def insert_before(self, after_node, new_node):
if not after_node:
raise Exception('after_node is nil')
if self.head is after_node:
new_node.next = self.head
self.head = new_node
return
for node in self:
if node.next is after_node:
self.insert_after(node, new_node)
return
# ******* Deletion
def delete_node(self, key):
if self.head and self.head.data and self.head.data == key:
self.head = target_node.next
return
for node in self:
if node.next and node.next.data and node.next.data == key:
node.next = node.next.next
return
raise Exception(f'node with key {key} not found')
def delete_node_at_index(self, index):
if not self.head:
raise Exception('list is empty')
if index == 0:
self.head = self.head.next
return
i = 0
for node in self:
if i == index - 1:
node.next = node.next.next
return
i += 1
# ******* Swap
# ******* Reversal
# ******* Merge
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment