🔄
In-Place List Reversal — prev / curr / next

Walk a linked list with three pointers — save the next node, flip the current node's pointer backward, then slide the window forward — reversing the chain in O(n) time with O(1) extra space.

🔗 Linked List 📌 In-Place 🔁 Pointer Reversal Time O(n) Space O(1)
📌 When to Use
  • Reverse an entire linked list in-place (LC 206)
  • Reverse a subrange [left, right] of a list (LC 92)
  • Reverse in K-groups repeatedly (LC 25)
  • Check palindrome by reversing second half (LC 234)
  • Reorder list: find middle + reverse + merge (LC 143)
🧠 Key insight: you only need three pointers (prev, curr, next). No stack, no recursion, no extra memory needed. The trick is saving next before overwriting curr.next.
⏱️ Complexity
Time
O(n)
Space
O(1)

Each node is visited exactly once. Only 3 pointer variables are used regardless of list length — truly in-place. For range reversal [left,right] it's O(right−left+1) time. For K-group it's still O(n) total with O(1) extra space (iterative) or O(n/k) stack depth (recursive).

Live Animation · Linked List Reversal · LC #206
Problem Given a singly linked list 1 → 2 → 3 → 4 → null, reverse it in-place. Use three pointers: prev, curr, next — at each step flip the curr→next arrow to point backward, then advance all three pointers forward.
Input: head = [1,2,3,4] · Answer: [4,3,2,1]
Step 0 / 17
🏁 Initial 💾 Save Next 🔁 Flip Arrow ➡️ Advance Pointers ✅ Done
null 1 node 1 2 node 2 3 node 3 4 node 4 null 🔵 prev 🟠 curr 🟢 next
🔵 prev = null
🟠 curr = node 1
🟢 next = 
🔢 iteration = 0
🏁 Initial state — prev = null, curr = node 1. All arrows point right →. We will reverse them one by one.
ListNode prev = null, curr = head;
☕ Pattern Skeleton Java 8
// ─── Pattern 1: Reverse Entire List (LC 206) ─────────────────────────────── ListNode prev = null, curr = head; while (curr != null) { ListNode next = curr.next; // 💾 save next before overwriting curr.next = prev; // 🔁 flip pointer ← (core step!) prev = curr; // ➡️ advance prev curr = next; // ➡️ advance curr } return prev; // new head (was last node) // ─── Pattern 2: Reverse Range [left, right] (LC 92) ───────────────────────── // 1. Create dummy node: dummy.next = head // 2. Walk (left-1) steps to find node BEFORE reversal start // 3. Reverse (right - left + 1) nodes using the 3-pointer pattern above // 4. Reconnect: // beforeLeft.next = reversedHead (first reversed node) // reversalTail.next = nodeAfterRight (node right after range) return dummy.next; // ─── Pattern 3: Reverse K-Group (LC 25) ────────────────────────────────────── // 1. Count k nodes ahead — if fewer than k remain, stop (don't reverse) // 2. Reverse exactly k nodes using the 3-pointer pattern // 3. The original first node of the group becomes the new tail: // groupHead.next = reverseKGroup(curr, k) // recurse or iterate // 4. Return groupNewHead (was the k-th node) // ─── Pattern 4: Find Middle (LC 876, helper) ───────────────────────────────── // Use slow/fast pointers, then reverse from slow.next onward ListNode slow = head, fast = head; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } // slow is now at middle — reverse slow.next
🎯 Practice Problems