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;
    }
};
相关推荐
VT.馒头3 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
不穿格子的程序员8 小时前
从零开始写算法——普通数组篇:缺失的第一个正数
算法·leetcode·哈希算法
VT.馒头10 小时前
【力扣】2722. 根据 ID 合并两个数组
javascript·算法·leetcode·职场和发展·typescript
执着25910 小时前
力扣hot100 - 108、将有序数组转换为二叉搜索树
算法·leetcode·职场和发展
兩尛10 小时前
160. 相交链表/c++
数据结构·链表
2302_8138062211 小时前
【嵌入式修炼:数据结构篇】——单向链表的排序
数据结构·链表·排序算法
52Hz11811 小时前
力扣230.二叉搜索树中第k小的元素、199.二叉树的右视图、114.二叉树展开为链表
python·算法·leetcode
苦藤新鸡11 小时前
56.组合总数
数据结构·算法·leetcode
菜鸟233号11 小时前
力扣647 回文子串 java实现
java·数据结构·leetcode·动态规划
LiLiYuan.11 小时前
【Cursor 中找不到LeetCode 插件解决办法】
算法·leetcode·职场和发展