当前位置:首页 > 牛客 > 【牛客157题】:反转链表指定区间(虚拟头节点解法)

【牛客157题】:反转链表指定区间(虚拟头节点解法)

5个月前 (07-06)

【牛客157题】:反转链表指定区间(虚拟头节点解法) 链表反转 链表 虚拟头节点 双指针 牛客 第1张

一、题目解读

牛客第157题要求反转链表中第m到n个节点(包含m和n)的区间,并保持其他节点顺序不变。例如,给定链表1→2→3→4→5,m=2,n=4,应返回1→4→3→2→5。题目重点在于处理边界条件(如m=1或n为末尾节点)及高效反转指定区间。

二、解题思路

用户代码采用“虚拟头节点+双指针迭代”策略:

1. 创建虚拟头节点dummy,指向原链表头head,简化边界处理(避免单独讨论m=1的情况)。

2. 分两步操作:

    Step1:通过指针pre定位到m-1节点,作为反转区间的起始点前驱。

    Step2:利用cur指针遍历m到n区间,通过临时变量tmp交换后续节点指针,实现局部反转。

3. 时间复杂度O(n),空间复杂度O(1),核心在于通过临时指针规避复杂指针操作

三、解题步骤

1. 初始化:构建虚拟头节点dummy,并让pre指向它。

2. 定位前驱:通过for循环移动pre至m-1位置,确保后续反转的起点正确。

3. 区间反转:

    设置cur=pre.next(即m位置节点)。

    迭代n-m次,每次通过tmp暂存cur.next,将cur.next指向tmp.next(断开原链接),再将tmp插入pre与cur之间,完成局部反转。

4. 返回结果:最终head变为dummy.next(即原head或反转后的新头节点)。

四、代码与注释

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        ListNode dummy(-1); // 虚拟头节点简化边界处理
        dummy.next = head;
        ListNode *pre = &dummy; // pre指向虚拟头节点
        
        // Step1: 定位到m-1位置
        for (int i = 1; i < m; ++i) {
            pre = pre->next;
        }
        
        // Step2: 反转m到n区间
        ListNode *cur = pre->next; // cur从m位置开始
        for (int i = m; i < n; ++i) {
            ListNode *tmp = cur->next; // 暂存后续节点
            cur->next = tmp->next; // 切断cur与后续链接
            tmp->next = pre->next; // 将tmp插入pre与cur之间
            pre->next = tmp; // 更新pre.next指向反转后的节点
        }
        
        return dummy.next; // 返回结果链表头
    }
};

五、总结

本解法巧妙利用虚拟头节点统一边界逻辑,通过双指针迭代实现区间反转。关键点在于:

1. 虚拟头节点避免对m=1的特殊处理,使代码更简洁。

2. 反转过程通过临时指针暂存与交换,确保指针操作正确性。

3. 时间复杂度线性,适用于大规模链表场景。

掌握该思路能有效应对链表区间操作类题目。


参考:牛客157题解

原创内容 转载请注明出处

分享给朋友:

相关文章

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

题目重解我们面对一个经典背包问题的变体:给定n个物品,每个物品有重量w和价值v,背包容量为V。需要回答两个问题:1) 普通情况下能获得的最大价值;2) 必须恰好装满背包时的最大价值(若无法装满则输出0...

力扣145:递归之美 轻松掌握二叉树后序遍历

力扣145:递归之美 轻松掌握二叉树后序遍历

题目解读二叉树的后序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。这种遍历方式特别适合需要先处理子节点再处理父节点的场景,如内存释放...

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

【牛客227题解析】合并K个有序链表的优先队列解法(附代码)

【牛客227题解析】合并K个有序链表的优先队列解法(附代码)

一、题目解读牛客227题要求合并K个有序链表,即将多个有序的单向链表合并成一个有序链表。题目考察的核心是对链表操作的熟练度以及高效算法的设计,通常需要平衡时间复杂度和空间复杂度,确保合并过程稳定且高效...

2024年GESP五级成绩排序算法解析:洛谷B3968代码实现与优化思路

2024年GESP五级成绩排序算法解析:洛谷B3968代码实现与优化思路

一、题目解读题目要求对n名学生的语文、数学、英语成绩进行排序,并输出按原始输入顺序的排名。排序规则需依次比较总分、语数总分、语数最高分,若完全相同时保持原始顺序。需处理并列排名,确保相同成绩的学生获得...

LeetCode 2074题解:反转链表中的节点间隔(虚拟节点+分组反转)

LeetCode 2074题解:反转链表中的节点间隔(虚拟节点+分组反转)

一、题目解读LeetCode 2074题要求对链表进行分组反转:将链表按节点数分组,若当前组长度为偶数则反转该组节点,奇数长度则保持不变。例如,输入链表 [1,2,3,4,5,6],分组后 [1,2,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。