day131—链表—反转链表Ⅱ(区域反转)(LeetCode-92)

题目描述

给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:

复制代码
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

复制代码
输入:head = [5], left = 1, right = 1
输出:[5]

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

解决方案:

这段代码的核心功能是反转单链表中指定区间 [left, right] 内的节点 (比如原链表 1→2→3→4→5,left=2、right=4 时,反转后为 1→4→3→2→5),采用「迭代法 + 虚拟头节点」实现,时间复杂度 O(n)、空间复杂度 O(1),是区间反转链表的经典解法。

核心逻辑

代码通过 "定位反转起点 + 局部反转 + 重新连接" 三步完成区间反转,核心是用虚拟头节点规避头节点反转的边界问题:

  1. 虚拟头节点与定位前驱 :创建虚拟头节点 dx 指向原链表头,先找到反转区间的前驱节点 p0(即 left 位置的前一个节点),避免反转头节点时的空指针问题;
  2. 局部区间反转 :以 p0->next 为起点,用 pre/cur/nxt 三个指针,迭代反转 [left, right] 范围内的节点(反转逻辑和完整反转链表一致);
  3. 重新连接链表 :反转完成后,将原反转起点的节点(现在是反转区间的尾节点)指向反转区间后的第一个节点 cur,再将 p0 指向反转区间的新头节点 pre,恢复链表完整性;
  4. 返回结果 :最终返回虚拟头节点的 next(即新链表的头节点)。

总结

  1. 核心思路:用虚拟头节点简化边界处理,先定位反转区间前驱,再局部反转,最后重新拼接链表;
  2. 关键操作:反转后 p0->next->next = curp0->next = pre 是重新连接链表的核心,避免区间反转后链表断裂;
  3. 效率特点:一次遍历完成定位 + 反转 + 拼接,时间 O(n)、空间 O(1),是区间反转链表的最优解法。

函数源码:

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        ListNode dx(0,head);
        
        ListNode* p0=&dx;
        for(int i=0;i<left-1;i++){
            p0=p0->next;
        }//到达反转区域的前一个结点:p0

        ListNode* nxt=nullptr;
        ListNode* pre=nullptr;
        ListNode* cur=p0->next;//反转的起始节点:p0->next
        for(int i=0;i<right-left+1;i++){
            nxt=cur->next;
            cur->next=pre;
            pre=cur;
            cur=nxt;
        }
        p0->next->next=cur;
        p0->next=pre;
        return dx.next;
    }
};
相关推荐
圣保罗的大教堂2 小时前
leetcode 2943. 最大化网格图中正方形空洞的面积 中等
leetcode
独自破碎E3 小时前
包含min函数的栈
android·java·开发语言·leetcode
0和1的舞者3 小时前
力扣hot100-链表专题-刷题笔记(一)
数据结构·链表·面试·刷题·知识
Tisfy3 小时前
LeetCode 2943.最大化网格图中正方形空洞的面积:小小思维
算法·leetcode·题解·数组·思维·排序·连续
平生不喜凡桃李3 小时前
LeetCode: 基本计算器详解
算法·leetcode·计算器·逆波兰表达式
Swift社区3 小时前
LeetCode 375 - 猜数字大小 II
算法·leetcode·swift
漫随流水4 小时前
leetcode算法(257.二叉树的所有路径)
数据结构·算法·leetcode·二叉树
有一个好名字4 小时前
力扣-二叉树的最大深度
算法·leetcode·深度优先
MSTcheng.4 小时前
【算法】滑动窗口解决力扣『水果成篮』问题
算法·leetcode·哈希算法