← BackDSA Patterns › Linked List › In-Place List Reversal🔗 Linked List
🔄
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.
🧠 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
🔵 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 onwardListNode 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