求教关于【链表内指定区间反转】用Java代码实现中的问题

链表小白,实在理解不了,就来求答案了!救救孩子吧!!!

第一种:

public static ListNode reverseBetweenOns (ListNode head, int m, int n) {
    // 定义虚拟头节点vir
    ListNode virtual = new ListNode(0);
    virtual.next = head;

    //反转开始前一节点&&开始节点
    ListNode preLeftHead = virtual;
    ListNode leftHead;

    for (int i = 0; i < m -1; i ++) {
        preLeftHead = preLeftHead.next;
    }
    leftHead = preLeftHead.next;

    //反转结束节点&&结束后一节点
    ListNode rightHead = preLeftHead;
    for (int i = 0; i < n - m + 1; i ++) {
        rightHead = rightHead.next;
    }
    ListNode preRightHead = rightHead.next;

    // 断开
    preLeftHead.next = null;
    rightHead.next = null;

    // 指定区间(m~n)反转
    printListNode(leftHead, "leftHead反转前链表值");  //打印反转前leftHead的值
    ListNode pre = reverseList(leftHead);
    printListNode(leftHead, "leftHead反转后链表值");  //打印反转后leftHead的值
  
    // 连接并返回
    preLeftHead.next = pre;
    leftHead.next = preRightHead;
    return virtual.next;
}

/**
 * 反转链表
 * 反转一个单链表。
 * @param head  链表头节点
 * @return   反转后的链表头节点
 */
public static ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) return head;

    ListNode pre = null;
    while (head != null) {
        ListNode next = head.next;
        head.next = pre;
        pre = head;
        head = next;
    }
    return pre;
}

/**
 *  输出链表节点的值
 * @param listNode  链表头节点
 * @param split  分隔符
 */
public static void printListNode(ListNode listNode, String split) {
    int i = 1;
    while (listNode != null) {
        System.out.println("节点(" + split +")_" + i + " :" + listNode.val);
        listNode=listNode.next;
        i++;
    }
}

第二种:

public static ListNode reverseBetweenOns (ListNode head, int m, int n) {
    ... ... ...
    ... ... ...
    // 指定区间(m~n)反转
    printPreNode(leftHead);
    ListNode pre = null;
    // 反转链表
    while (leftHead != null) {
        ListNode next = leftHead.next;
        leftHead.next = pre;
        pre = leftHead;
        leftHead = next;
    }
    printPreNode(leftHead);
    ... ... ...
    ... ... ...

准备的数据:

ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);
ListNode newHead = reverseBetweenOns(head, 2, 4 );

第二种leftHead是null我知道是因为上面循环。但是第一种在打印反转前后leftHead链表值的时候输出是下面这个样子。不太理解为什么leftHead在反转后会有值并且只有一个2。求教。。。。。。。。

节点(leftHead反转前链表值)_1 :2

节点(leftHead反转前链表值)_2 :3

节点(leftHead反转前链表值)_3 :4

节点(leftHead反转后链表值)_1 :2

全部评论
这个题目很经典 自己画图比较好理解
点赞 回复 分享
发布于 03-21 21:31 北京

相关推荐

#找工作#&nbsp;&nbsp;#22届毕业,是读研还是拿外包offer先苟着# “毕业即失业”,这话听着是不是有点扎心?2025年的春天,大陆的经济市场像一朵被冷风吹蔫的花,市场容量缩水,机会变少,尤其是对我们这些刚毕业、0经验的小白来说,找工作仿佛成了闯关游戏——第一关就卡在了“需要经验”这堵墙上。简历投出去像石沉大海,面试机会寥寥无几,朋友圈里满是“求内推”的哀嚎。你是不是也偷偷问过自己:这日子,咋过啊?别急,宝,路总在脚下。经济萎缩是事实,但机会从来不是等来的,而是闯出来的。小明的故事或许能给你点灵感。他是去年毕业的前端开发小白,和你我一样,0经验,投了上百份简历,连个“已读”都没捞着。可他没放弃,硬着头皮学了&nbsp;React,做了个在线工具——一个能帮程序员快速格式化代码的小玩意儿。结果呢?上线一个月,靠着&nbsp;Reddit&nbsp;和&nbsp;GitHub&nbsp;推广,竟然有了几百个用户,还顺手接了个小外包单,赚了人生第一桶金。现在,他一边完善项目,一边远程给一家海外初创公司打工,月入几千刀,日子过得比谁都滋润。你看,机会不是没有,只是换了模样。市场小,不代表没需求。互联网时代,国内不行还有国际,线下不行还有线上。你的前端技能,配上那口流利的英语(雅思三个8分可不是盖的),完全可以跳出本地市场的框框,去更大的舞台闯一闯。远程工作、SaaS&nbsp;小产品、内容创作,甚至&nbsp;Web3&nbsp;的新兴领域,都是你可以试水的方向。别盯着那几家大厂的&nbsp;HC(招聘名额),它们缩招不代表全世界都关门。所以,你找工作了吗?宝。别光顾着刷剧吐槽经济了,动起来吧!每天&nbsp;12&nbsp;小时的投入,够你把&nbsp;React&nbsp;啃透,把&nbsp;Node.js&nbsp;玩熟,再做一个拿得出手的项目。投简历的同时,不妨试试裂变式的方法——做个小工具放网上,录几期英文教程发&nbsp;YouTube,或者在&nbsp;Upwork&nbsp;上接单,哪怕起初只有几百块的收入,那也是你打开财富自由的第一步。市场再冷,也有热气腾腾的角落等着你去点燃。宝,2025&nbsp;是挑战,也是机会。经济萎缩不可怕,可怕的是停下脚步。你的前端技术是翅膀,英语是风,飞出去看看吧,也许下个月,你就能笑着跟我说:“嘿,我找到工作了,还顺便赚了点外快!”别犹豫了,今天就迈出第一步,你值得更好的未来。@你没有那么糟糕,你很棒 
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务