class Node: def __init__(self, data): self.data = data self.next = None class LinkedList: def __init__(self): self.head = None def clear(self): # O(1) self.head = None def append(self, data): # # O(N) if self.head: pointer = self.head while pointer.next: # # O(N) pointer = pointer.next pointer.next = Node(data) else: self.head = Node(data) def delete(self, index): # # O(N) if index == 0: self.head = self.head.next else: pointer = self[index - 1] # # O(N) pointer.next = pointer.next.next def insert(self, index, data): # # O(N) node = Node(data) if index == 0: node.next = self.head self.head = node else: pointer = self[index - 1] # # O(N) node.next = pointer.next pointer.next = node def __len__(self): # # O(N) count = 0 pointer = self.head while pointer: count += 1 pointer = pointer.next return count def __getitem__(self, index): # # O(N) pointer = self.head while index > 0: # # O(N) pointer = pointer.next index -= 1 return pointer def __setitem__(self, index, data): # # O(N) pointer = self[index] pointer.data = data def print_linked_list(linked_list: LinkedList): print("**** Printing linked list ****") pointer = linked_list.head while pointer: print(pointer.data) pointer = pointer.next print("**** End ****") linked_list = LinkedList() linked_list.append(0) linked_list.append(10) linked_list.append(20) linked_list.append(30) linked_list.append(40) linked_list.append(50) print_linked_list(linked_list) linked_list.delete(4) print_linked_list(linked_list) linked_list.insert(4, 41) print_linked_list(linked_list) linked_list[2] = 23 print_linked_list(linked_list) print(len(linked_list)) linked_list.clear() print_linked_list(linked_list)