LeetCode 92 反转链表 II 全流程详解

题目描述

给定一个单链表的头节点 head 和两个整数 leftright,反转链表中从位置 leftright 的节点,并返回反转后的链表。要求只用一次遍历。

示例:

  • 输入:head = [1,2,3,4,5], left = 2, right = 4
  • 输出:[1,4,3,2,5]

约束条件:

  • 1 ≤ n ≤ 500(n为节点个数)
  • -500 ≤ Node.val ≤ 500
  • 1 ≤ left ≤ right ≤ n

常见思路与分析

1. 借助栈法

利用栈或数组暂存区间节点或者指针,然后两两配对交换节点值。这种方法本质上是"空间换时间",但每对节点都需要遍历链表两次,效率相对较低,且空间复杂度 O(k)(k为区间长度)。原链表结构未改变,缺乏链表操作的"原地特性"。

2. 双指针遍历法

每次从头分别定位到 leftright,再交换节点值,并不断推进 left++right--。这种方式直观易懂,但每次都要重新从头定位,整体时间复杂度达到 O(k²),不适合区间较大的情况。

3. 一次遍历,原地反转指针(官方最佳)

官方推荐和面试官最欣赏的是只用一次遍历、原地反转指针的方案。


最佳解法思路

找到反转区间边界节点

用指针遍历链表直到第 left-1 个节点(记为 pre),和 left 节点(记为 start)。

原地反转 [left, right] 区间指针

每次将当前节点 curnext 指向 pre,实现链表反转。

缓存关键指针保存连接关系

  • 区间前的 pre
  • 区间头 start(反转后变为尾)
  • 反转后的区间头 end
  • 区间后的 next

反转后接回原链表

复制代码
pre->next = end
start->next = next

总结与收获

  1. 链表题的核心在于理解指针和前后关系,找准"断点"并连接复原
  2. 面试时建议用 dummy node 防止 left=1 的特殊情况,让代码更健壮
  3. 这种方法只需一次遍历,空间 O(1) 原地操作
  4. 画图、写 down 链表节点,理清区间四端的指向关系,是高效解题的关键

你只要理解"反转区间链表的四段连接",无论什么变体题型,都能轻松应对!


参考链接

相关推荐
灵感__idea6 小时前
Hello 算法:贪心的世界
前端·javascript·算法
澈2077 小时前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
ambition202428 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_8 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
qiqsevenqiqiqiqi8 小时前
前缀和差分
算法·图论
代码旅人ing8 小时前
链表算法刷题指南
数据结构·算法·链表
Yungoal8 小时前
常见 时间复杂度计算
c++·算法
6Hzlia8 小时前
【Hot 100 刷题计划】 LeetCode 48. 旋转图像 | C++ 矩阵变换题解
c++·leetcode·矩阵
不爱吃炸鸡柳9 小时前
单链表专题(完整代码版)
数据结构·算法·链表
CylMK9 小时前
题解:AT_abc382_d [ABC382D] Keep Distance
算法