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 链表节点,理清区间四端的指向关系,是高效解题的关键

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


参考链接

相关推荐
不知名XL2 分钟前
day50 单调栈
数据结构·算法·leetcode
@––––––17 分钟前
力扣hot100—系列2-多维动态规划
算法·leetcode·动态规划
xsyaaaan29 分钟前
代码随想录Day31动态规划:1049最后一块石头的重量II_494目标和_474一和零
算法·动态规划
Jay Kay1 小时前
GVPO:Group Variance Policy Optimization
人工智能·算法·机器学习
Epiphany.5561 小时前
蓝桥杯备赛题目-----爆破
算法·职场和发展·蓝桥杯
YuTaoShao2 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法三)DP 空间优化
算法·leetcode·职场和发展
茉莉玫瑰花茶2 小时前
C++ 17 详细特性解析(5)
开发语言·c++·算法
cpp_25012 小时前
P10570 [JRKSJ R8] 网球
数据结构·c++·算法·题解
cpp_25012 小时前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
uesowys2 小时前
Apache Spark算法开发指导-Factorization machines classifier
人工智能·算法