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;
    }
};
相关推荐
南境十里·墨染春水16 小时前
数据结构 —— 链表
数据结构·链表
始三角龙20 小时前
LeetCode hoot 100 -- 缺失的第一个正整数
算法·leetcode·职场和发展
gumichef1 天前
二叉树链式结构的实现
算法·链表·二叉树·队列
战南诚1 天前
力扣 之 198.打家劫舍
python·算法·leetcode
Dlrb12111 天前
数据结构-链表
数据结构·链表·逻辑结构·单向链表·物理结构·valgrind工具
_日拱一卒1 天前
LeetCode:105从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
ʚ希希ɞ ྀ1 天前
dp反思与总结
算法·leetcode·动态规划
菜菜的顾清寒1 天前
力扣Hot100(23)反转链表
算法·leetcode·链表
m0_629494731 天前
LeetCode 热题 100-----27. 合并两个有序链表
数据结构·算法·leetcode·链表
水木流年追梦1 天前
大模型入门-RL基础
开发语言·python·算法·leetcode·正则表达式