Basics
Design
707. Design Linked List
- Single Linked List
- Doubly Linked List
Interactive Visualization
- Python
class SinglyLLNode:
def __init__(self, val: Any, next=None):
self.val = val
self.next = next
class MyLinkedList:
def __init__(self):
self.sentinel = SinglyLLNode(None, None)
self.len = 0
def get(self, index: int) -> int:
node = self.goToIndex(index)
return node.val if node else -1
def addAtHead(self, val: int) -> None:
new_node = SinglyLLNode(val)
new_node.next = self.sentinel.next
self.sentinel.next = new_node
self.len += 1
def addAtTail(self, val: int) -> None:
new_node = SinglyLLNode(val)
current_node = self.sentinel
while current_node.next:
current_node = current_node.next
current_node.next = new_node
self.len += 1
def addAtIndex(self, index: int, val: int) -> None:
prev_node = self.goToIndex(index - 1)
if prev_node:
new_node = SinglyLLNode(val)
new_node.next = prev_node.next
prev_node.next = new_node
self.len += 1
def goToIndex(self, index: int) -> Optional[SinglyLLNode]:
current_index = -1
current_node = self.sentinel
while current_node.next and current_index < index:
current_node = current_node.next
current_index += 1
if current_index == index:
return current_node
return None
def deleteAtIndex(self, index: int) -> None:
prev_node = self.goToIndex(index - 1)
if prev_node and prev_node.next:
prev_node.next = prev_node.next.next
self.len -= 1
Interactive Visualization
- Python
class DoublyLLNode:
def __init__(self, val: Any, prev=None, next=None):
self.val = val
self.prev = prev
self.next = next
class MyLinkedList:
def __init__(self):
self.sentinel = DoublyLLNode(None, None, None)
self.tail = DoublyLLNode(None, self.sentinel, None)
self.sentinel.next = self.tail
self.len = 0
def goToIndex(self, index: int) -> Optional[DoublyLLNode]:
current_index = -1
current_node = self.sentinel
while current_node.next != self.tail and current_index < index:
current_node = current_node.next
current_index += 1
if current_index == index:
return current_node
return None
def get(self, index: int) -> int:
node = self.goToIndex(index)
self.print()
return node.val if node else -1
def addAtHead(self, val: int) -> None:
new_node = DoublyLLNode(val, prev=self.sentinel, next=self.sentinel.next)
self.sentinel.next = new_node
new_node.next.prev = new_node
self.len += 1
def addAtTail(self, val: int) -> None:
new_node = DoublyLLNode(val, prev=self.tail.prev, next=self.tail)
self.tail.prev = new_node
new_node.prev.next = new_node
self.len += 1
def addAtIndex(self, index: int, val: int) -> None:
prev_node = self.goToIndex(index - 1)
if prev_node:
new_node = DoublyLLNode(val, prev=prev_node, next=prev_node.next)
prev_node.next = new_node
new_node.next.prev = new_node
self.len += 1
def deleteAtIndex(self, index: int) -> None:
if not 0 <= index < self.len:
return
prev_node = self.goToIndex(index - 1)
prev_node.next.next.prev = prev_node
prev_node.next = prev_node.next.next
self.len -= 1
def print(self):
cur = self.sentinel.next
print("HEAD -> ", end="")
while cur and cur.val:
print(f"{cur.val} -> ", end="")
cur = cur.next
print("TAIL")
cur = self.tail.prev
print("TAIL -> ", end="")
while cur and cur.val:
print(f"{cur.val} -> ", end="")
cur = cur.prev
print("HEAD")
Reusable Code
Count Linked List Nodes
def getLen(head):
length = 0
while head:
head = head.next
length += 1
return length
Print the Elements of a Linked List
def print_ll(head, attr_name="val"):
while head:
value = getattr(head, attr_name, None)
print(value, end=" -> " if head.next else "\n")
head = head.next