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

链表内指定区间反转

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
这里为什么要设置一个虚拟的头节点呢?有谁能解释一下吗?
3 回复 分享
发布于 2022-02-23 21:38
牛,解法二就地翻转,太妙了
3 回复 分享
发布于 2022-03-23 10:22
解法二的图画得有问题,不太好理解
3 回复 分享
发布于 2022-04-17 09:27
解法2的图不好,但是注意文字就行了;cur和pre指向的部分是永远不变的,只变curNext。很玄妙。
3 回复 分享
发布于 2022-08-03 20:10
不用虚节点得一个判断吧,分一下头结点倒不倒转
2 回复 分享
发布于 2022-03-02 23:50
虚拟头节点YYDS,不加这个 要讨论边界的N种情况,我主体写完后,就是讨论不清楚这个边界划分,不停的加if,也没写出来。。。
2 回复 分享
发布于 2022-04-19 13:43
解法2的图 画的真的很具有迷惑性,其实解法2,就是固定节点,不变,让cur和 cur.next 换一下 位置而已
2 回复 分享
发布于 2022-10-20 10:18 北京
也可以不用虚拟节点
1 回复 分享
发布于 2022-03-01 10:41
我感觉翻转的部分不太对啊
1 回复 分享
发布于 2022-03-06 23:24
你们解法1运行的结果对吗 我也是这么个思路写的 但是结果不对呢
1 回复 分享
发布于 2022-03-28 15:15
没绷住。光看代码真就觉得你搁这乱写,就算看了第一个评论还是觉得你在乱写。直到看了示意图,再自己想着写一遍以后发现跟你写的又一样了。。。没绷住。
1 回复 分享
发布于 2022-10-11 05:48 美国
解法一和二没本质区别,只是反转用的方式不一样,一是双指针法,二是头插法,时间复杂度是一样的。
1 回复 分享
发布于 2022-12-28 16:55 上海
第二个图画的是个寂寞,我也是服了你
1 回复 分享
发布于 2023-05-21 17:28 上海
虚拟头节点是精髓
点赞 回复 分享
发布于 2022-02-28 21:22
太牛了!太绕了!
点赞 回复 分享
发布于 2022-03-01 20:36
为什么必须设置dummyNode虚拟头节点,再让pre=dummyNode呢,为啥直接设置pre为虚拟头节点就不对
点赞 回复 分享
发布于 2022-03-20 10:06
new ListNode(-1)这个地方,编译器会报错啊,有大佬解释一下嘛
点赞 回复 分享
发布于 2022-03-22 19:16

相关推荐

找不到工作死了算了:没事的,雨英,hr肯主动告知结果已经超越大部分hr了
点赞 评论 收藏
分享
10-25 23:12
门头沟学院 Java
点赞 评论 收藏
分享
258 47 评论
分享
牛客网
牛客企业服务