Skip to content

[LeetCode 92] 反转链表 II

中等已解决Aug 27, 2025(2天前) 时间 O(n) 空间 O(1) 原题链接

🎯 请点击上方原题链接,查看题目描述👆

💭 解题思路#

这道题要求反转链表中指定区间的节点,核心思路是使用头插法来实现局部反转。

算法步骤:#

  1. 创建虚拟头节点 - 统一处理边界情况
  2. 定位到反转区间的前一个节点 - 通过循环找到 pre 节点
  3. 使用头插法反转指定区间 - 将区间内的节点逐个移动到区间开头

关键思想:#

💻 代码实现#

class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
// 创建虚拟头节点,简化边界处理
ListNode res = new ListNode(-1);
res.next = head;
ListNode pre = res;
// 定位到反转区间的前一个节点
for(int i = 0; i < left - 1; i++){
pre = pre.next;
}
// cur指向反转区间的第一个节点
ListNode cur = pre.next;
// 使用头插法反转 (right - left) 次
for(int i = 0; i < (right - left); i++){
ListNode temp = cur.next; // 保存要移动的节点
cur.next = temp.next; // cur跳过next节点
temp.next = pre.next; // next插入到pre后面
pre.next = temp; // 更新pre的next指针
}
return res.next;
}
}

🔍 关键要点#

核心操作(头插法):

🤔 反思总结#

这道题的精髓在于头插法的应用,通过巧妙的指针操作实现局部反转,避免了复杂的链表拆分和重组。关键是理解每次操作都是将当前节点的下一个节点”提升”到区间开头的思想。

时间复杂度: O(n) - 最多遍历整个链表一次
空间复杂度: O(1) - 只使用常数个额外变量