Pattern #13

Linked List

Important interview questions, thinking patterns, node pointer manipulations, and rules for solving linked list problems in Go.

Must Solve

15 core questions — solve these first.

  1. 1.Reverse Linked List
    easy
  2. 2.Middle of the Linked List
    easy
  3. 3.Linked List Cycle
    easy
  4. 4.Linked List Cycle II
    medium
  5. 5.Merge Two Sorted Lists
    easy
  6. 6.Remove Nth Node From End of List
    medium
  7. 7.Palindrome Linked List
    easy
  8. 8.Intersection of Two Linked Lists
    easy
  9. 9.Add Two Numbers
    medium
  10. 10.Reorder List
    medium
  11. 11.Swap Nodes in Pairs
    medium
  12. 12.Reverse Linked List II
    medium
  13. 13.Reverse Nodes in K-Group
    hard
  14. 14.Copy List with Random Pointer
    medium
  15. 15.Sort List
    medium

Also Important

10 more questions worth practicing.

  1. 16.Remove Linked List Elements
    easy
  2. 17.Delete Node in a Linked List
    medium
  3. 18.Odd Even Linked List
    medium
  4. 19.Partition List
    medium
  5. 20.Rotate List
    medium
  6. 21.Remove Duplicates from Sorted List
    easy
  7. 22.Remove Duplicates from Sorted List II
    medium
  8. 23.Merge K Sorted Lists
    hard
  9. 24.Flatten a Multilevel Doubly Linked List
    medium
  10. 25.LRU Cache
    medium

How to Think

  1. Need reverse?prev, curr, next
  2. Need middle?slow + fast
  3. Need cycle?slow + fast (if they meet: cycle exists)
  4. Need nth node from end?two pointers with gap
  5. Need merge sorted lists?pointer on list A, pointer on list B
  6. Need change head safely?dummy node
  7. Need reconnect nodes?Always save next before changing links

Go Node Struct & Templates

ListNode Definition & Traversal

type ListNode struct {
    Val  int
    Next *ListNode
}

// Basic Traversal
curr := head
for curr != nil {
    curr = curr.Next
}

Reverse Linked List Template

var prev *ListNode
curr := head

for curr != nil {
    next := curr.Next // 1. Save next
    curr.Next = prev  // 2. Reverse link
    prev = curr       // 3. Move prev forward
    curr = next       // 4. Move curr forward
}
return prev // New head

👉 Time: O(n) | Space: O(1)

The Dummy Node Pattern

Without a dummy node, operations that modify the head (like removing the first node, merging lists, or partitioning) require annoying special-case conditional logic.

dummy := &ListNode{Next: head}
curr := dummy

// Perform operations safely...

return dummy.Next // Returns updated head clean & safe!

💡 Golden Rule: "Dummy node removes annoying head edge cases."

Visual Memory Rule
prev   curr   next
 ↓      ↓      ↓
nil ← [1]    [2] → [3]

1. save next
2. curr.Next = prev
3. prev = curr
4. curr = next

💡 Golden Rule: "In Linked List problems, draw the pointers first — then change the links."

Singly vs Doubly Linked List

Singly Linked List
[1] → [2] → [3] → nil

Each node knows only next. Lower memory usage per node.

Doubly Linked List
nil ← [1] ⇄ [2] ⇄ [3] → nil

Each node knows both prev and next. Enables O(1) removals (e.g. LRU Cache).

Common Interview Mistakes

1. Losing the List

Reconnecting curr.Next = prev BEFORE saving next = curr.Next causes loss of the remaining nodes!

2. Nil Pointer Crash

Accessing fast.Next.Next without checking if fast != nil and fast.Next != nil first.

3. Forgetting Head Can Change

Returning original head after reversing or modifying the list instead of returning prev or dummy.Next.

4. Cycle Infinite Loop

Standard for curr != nil loop never terminates if a cycle exists. Use slow + fast pointers.

Interview Rules

  1. 1. Reverse list? → prev, curr, next
  2. 2. Find middle? → slow + fast (1x, 2x)
  3. 3. Detect cycle? → slow + fast
  4. 4. Nth from end? → two pointers with gap N
  5. 5. Merge sorted lists? → two list pointers
  6. 6. Head may change? → dummy node (dummy.Next = head)
  7. 7. Delete node? → reconnect links (prev.Next = curr.Next)
  8. 8. Always save next before changing pointers
  9. 9. Traversal costO(n)
  10. 10. Known-node insert/deleteO(1)

Small Rules

  1. Rule 1: Access by index is O(n) for Linked List vs O(1) for Array.
  2. Rule 2: Insert/delete when node pointer is known is O(1).
  3. Rule 3: Never lose the rest of the list — save next := curr.Next first.
  4. Rule 4: Use a dummy node when head may change.
  5. Rule 5: slow + fast is used for middle, cycle, cycle start, palindrome, and nth from end.

Production Thinking

LRU CacheHashMap (O(1) lookup) + Doubly Linked List (O(1) move to front)

Job QueueLinked nodes Job A → Job B → Job C for cheap insertions/removals

Browser Historyprevious ← current → next (Doubly linked navigation)

Undo / RedoDoubly linked state timeline

Memory Trade-OffEach node uses extra memory for pointer(s) vs contiguous array

Remember This

Reverse                     → prev + curr + next
Middle                      → slow + fast
Cycle                       → slow + fast
Nth from end                → pointer gap
Merge lists                 → two pointers
Head edge case              → dummy node
Changing link               → save next first
Known-node insert/delete    → O(1)

💡 Golden Rule: "In Linked List problems, draw the pointers first — then change the links."