Linked Lists
1 / 12
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
Sequential access only, O(1) insert/delete with pointer
dummy = ListNode(0, head)
current = dummy
# ... process ...
return dummy.next
Eliminates special cases for head modification
def reverse(head):
prev = None
curr = head
while curr:
next_node = curr.next # Save
curr.next = prev # Reverse
prev = curr # Advance prev
curr = next_node # Advance curr
return prev
1 -> 2 -> 3 -> None
Step 1: None <- 1 2 -> 3
Step 2: None <- 1 <- 2 3
Step 3: None <- 1 <- 2 <- 3
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
def has_cycle(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
Fast laps slow if cycle exists
def merge(l1, l2):
dummy = ListNode()
curr = dummy
while l1 and l2:
if l1.val <= l2.val:
curr.next = l1
l1 = l1.next
else:
curr.next = l2
l2 = l2.next
curr = curr.next
curr.next = l1 or l2
return dummy.next
Combine:
Most recent at head, least recent at tail
Get: Look up in map, move to front
Put:
| Pattern | Use Case |
|---|---|
| Dummy head | Head modification |
| Fast/slow | Middle, cycles |
| Prev pointer | Reversal |
| Hash + DLL | O(1) cache |
next first!)