THN Interview Prep

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 left and suffix after right stable
  • 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.
  • OptimalO(n) time / O(1) space — pointer before stops 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].

iterationbefore.Next head of reversed windowthen pulled
startnode 2node 3
repeatsgrows reversed prefix inside windowadvances 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 — before is dummy.

Pitfalls

  • Off-by-one on how many insert iterations (right-left times).
  • Losing then before rewiring — always stash start.Next as next then.

Similar Problems

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?

On this page