题解 | 链表内指定区间反转

链表内指定区间反转

http://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

解法一:双指针(两次遍历)

思路步骤:

  • 要反转局部链表,可以将该局部部分当作完整链表进行反转

  • 再将已经反转好的局部链表与其他节点建立连接,重构链表

  • 建议使用虚拟头节点的技巧,可以避免对头节点复杂的分类考虑,简化操作。

  • 反转前后图示:
    图片说明

  • 配图说明:
    图片说明

  • 反转步骤:
    图片说明

    Java参考代码:

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
       // 解法一:双指针(两次遍历)
       //说明:方便理解,以下注释中将用left,right分别代替m,n节点 

    public ListNode reverseBetween (ListNode head, int m, int n) {
             //设置虚拟头节点
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;

        ListNode pre = dummyNode;
        //1.走left-1步到left的前一个节点
        for(int i=0;i<m-1;i++){
            pre = pre.next;
        }

        //2.走roght-left+1步到right节点
        ListNode rigthNode = pre;
        for(int i=0;i<n-m+1;i++){
            rigthNode = rigthNode.next;
        }

        //3.截取出一个子链表
        ListNode leftNode = pre.next;
        ListNode cur = rigthNode.next;

        //4.切断链接
        pre.next=null;
        rigthNode.next=null;

        //5.反转局部链表
        reverseLinkedList(leftNode);

    

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

小白专属-牛客题解 文章被收录于专栏

专注于牛客平台编程题题解,文字+图解。内容很细,小白友好系列

全部评论
为啥我觉得你是乱写,翻转的部分不太对
6 回复 分享
发布于 2022-02-25 17:43
你这图画的看都看不懂,从头到尾数字顺序都不变的
5 回复 分享
发布于 2022-06-01 13:56
他没有乱写是我错了
4 回复 分享
发布于 2022-02-25 17:56
解法2的图不好,但是注意文字就行了;cur和pre指向的部分是永远不变的,只变curNext。很玄妙。
3 回复 分享
发布于 2022-08-03 20:10
解法二的图画得有问题,不太好理解
3 回复 分享
发布于 2022-04-17 09:27
牛,解法二就地翻转,太妙了
3 回复 分享
发布于 2022-03-23 10:22
这里为什么要设置一个虚拟的头节点呢?有谁能解释一下吗?
3 回复 分享
发布于 2022-02-23 21:38
解法2的图 画的真的很具有迷惑性,其实解法2,就是固定节点,不变,让cur和 cur.next 换一下 位置而已
2 回复 分享
发布于 2022-10-20 10:18 北京
虚拟头节点YYDS,不加这个 要讨论边界的N种情况,我主体写完后,就是讨论不清楚这个边界划分,不停的加if,也没写出来。。。
2 回复 分享
发布于 2022-04-19 13:43
不用虚节点得一个判断吧,分一下头结点倒不倒转
2 回复 分享
发布于 2022-03-02 23:50
第二个图画的是个寂寞,我也是服了你
1 回复 分享
发布于 2023-05-21 17:28 上海
解法一和二没本质区别,只是反转用的方式不一样,一是双指针法,二是头插法,时间复杂度是一样的。
1 回复 分享
发布于 2022-12-28 16:55 上海
没绷住。光看代码真就觉得你搁这乱写,就算看了第一个评论还是觉得你在乱写。直到看了示意图,再自己想着写一遍以后发现跟你写的又一样了。。。没绷住。
1 回复 分享
发布于 2022-10-11 05:48 美国
你们解法1运行的结果对吗 我也是这么个思路写的 但是结果不对呢
1 回复 分享
发布于 2022-03-28 15:15
我感觉翻转的部分不太对啊
1 回复 分享
发布于 2022-03-06 23:24
也可以不用虚拟节点
1 回复 分享
发布于 2022-03-01 10:41
还收费才能看?社会主义不能靠你了
点赞 回复 分享
发布于 2024-09-20 20:32 湖北
感谢各位赠送的小花花
点赞 回复 分享
发布于 2024-06-19 15:54 贵州
文字介绍很好,动态图画的只是为画而画,看动图很难理解,还是推荐手动调试
点赞 回复 分享
发布于 2023-08-05 21:37 江苏
第二个真的妙,pre对象和位置都不变,cur对象不变位置改变。执行n次反转n+1位
点赞 回复 分享
发布于 2023-07-31 15:44 北京

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
269
50
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务