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

链表内指定区间反转

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 北京

相关推荐

牛客266927136号:为啥实习经历写这么少,项目经历反而大写特写,最重要的还是实习经历吧,写具体点,什么场景下做了什么事,解决了什么问题,优化了什么场景,性能提升了多少多少
点赞 评论 收藏
分享
06-20 19:40
中原工学院 Java
网络存储:十几天不会让你拉人办卡就结束了吧?
点赞 评论 收藏
分享
评论
269
50
分享

创作者周榜

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