We can see linked list implementation in python in the following code. And with some important operations of the linked list. The time complexity of every operation is O(n) except insert_front and empty. And the complexity of insert_front and empty is O(1).
Singly Linked List
class Node(): def __init__(self, data = None, next = None): self.data = data self.next = next class LinkedList(): def __init__(self): self.head = None # insert_front def insert_front(self, data): new_node = Node(data) new_node.next = self.head self.head = new_node # insert_last def insert_last(self, data): new_node = Node(data) if self.head: current = self.head while current.next: current = current.next current.next = new_node else: self.head = new_node # insert_after def insert_after(self, target, data): if self.head == None: print('List is empty') return new_node = Node(data) current = self.head while current: if current.data == target: new_node.next = current.next current.next = new_node return current = current.next print(f'Node with data {data} not found') # insert_before def insert_before(self, target, data): if self.head == None: print('List is empty') return; if self.head.data == target: return self.insert_front(data) new_node = Node(data) current = self.head prev = self.head while current: if current.data == target: prev.next = new_node new_node.next = current return prev = current current = current.next print(f'Node with data {data} not found') # traverse def traverse(self): current = self.head nodes = [] while current: nodes.append(str(current.data)) current = current.next nodes.append('None') return '->'.join(nodes) # Size def size(self): current = self.head count = 0 while current: count += 1 current = current.next print(f'Total Node = {count}') # Search def search(self, data): current = self.head while current: if current.data == data: return True current = current.next return False # Remove def remove(self, target): if self.head == None: print('List is empty') return if self.head.data == target: self.head = self.head.next return prev = self.head current = self.head while current: if current.data == target: prev.next = current.next return prev = current current = current.next print(f'Node with data {target} not found') # empty def empty(self): return self.head == None lists = LinkedList() lists.insert_last(1) lists.insert_last(2) lists.insert_last(3) lists.insert_last(4) lists.insert_last(5) lists.insert_front(0) lists.insert_after(4, 11) lists.insert_before(0, 10) lists.insert_before(5, 15) lists.remove(15) print(lists.traverse()) lists.size() print(lists.empty()) print(lists.search(5)) print(lists.search(7))
Doubly Linked List
class Node(): def __init__(self, data): self.data = data self.prev = None self.next = None