92. Reverse Linked List II
At a Glance
- Topic: linked-list
- Pattern: In-place Linked List Reversal (Subrange)
- Difficulty: Medium
- Companies: Amazon, Google, Meta, Microsoft, Bloomberg
- Frequency: High
- LeetCode: 92
Problem (one-liner)
Reverse the nodes of a singly linked list from position left to position right (1-indexed, inclusive) in one pass style with O(1) extra memory.
Recognition Cues
- Reverse only a middle segment
- Keep prefix before
leftand suffix afterrightstable - Classic “pick front of remainder and stitch after anchor” loop
Diagram
At-a-glance flow (replace with problem-specific Mermaid as you refine this note). camelCase node IDs; no spaces in IDs.
Loading diagram…
Approaches
- Brute force — extract values between indices, reverse slice, rewrite —
O(n)time /O(n)space. - Better — same.
- Optimal —
O(n)time /O(1)space — pointerbeforestops at node before range; repeatedly move next node to front of segment.
Optimal Solution
Go
type ListNode struct {
Val int
Next *ListNode
}
func reverseBetween(head *ListNode, left int, right int) *ListNode {
dummy := &ListNode{Next: head}
before := dummy
for index := 1; index < left; index++ {
before = before.Next
}
start := before.Next
then := start.Next
for index := 0; index < right-left; index++ {
start.Next = then.Next
then.Next = before.Next
before.Next = then
then = start.Next
}
return dummy.Next
}JavaScript
class ListNode {
constructor(val = 0, next = null) {
this.val = val;
this.next = next;
}
}
function reverseBetween(head, left, right) {
const dummy = new ListNode(0, head);
let before = dummy;
for (let index = 1; index < left; index++) {
before = before.next;
}
let start = before.next;
let then = start.next;
for (let index = 0; index < right - left; index++) {
start.next = then.next;
then.next = before.next;
before.next = then;
then = start.next;
}
return dummy.next;
}Walkthrough
[1,2,3,4,5], left=2, right=4 → [1,4,3,2,5].
| iteration | before.Next head of reversed window | then pulled |
|---|---|---|
| start | node 2 | node 3 |
| repeats | grows reversed prefix inside window | advances tail |
Invariant: nodes before before stay fixed; window always contains the correct multiset.
Edge Cases
left == right— no-op loop range zero.- Reverse from head (
left == 1) — dummy handles anchor. - Reverse entire list —
beforeis dummy.
Pitfalls
- Off-by-one on how many insert iterations (
right-lefttimes). - Losing
thenbefore rewiring — always stashstart.Nextas nextthen.
Similar Problems
- 206. Reverse Linked List — full list special case.
- 143. Reorder List — reverse second half then weave.
- 234. Palindrome Linked List — controlled reversal of one segment.
Variants
- Reverse every k-group — repeat this kernel per block.
- Multiple disjoint ranges — careful anchor bookkeeping.
Mind-Map Tags
#linked-list #sublist-reverse #dummy-anchor #insert-front
Last updated on
Spotted something unclear or wrong on this page?