题解 | #调整牛群顺序#

调整牛群顺序

https://www.nowcoder.com/practice/a1f432134c31416b8b2957e66961b7d4

知识点:

  1. 单链表的遍历与操作。
  2. 快慢指针技巧。

题意分析:

题目描述了一个链表,表示农场里的牛,节点的值为牛的编号。农场主想要调整牛群的顺序,要求将链表中的倒数第n个节点移动到链表的末尾,并返回调整后的链表的头结点。

时间复杂度:

假设链表中有N个节点。

  1. 在代码中,我们需要先找到倒数第n+1个节点,需要遍历链表一次,这需要O(N)的时间复杂度。
  2. 然后,将倒数第n个节点移动到链表末尾,只需要常数时间操作,不影响时间复杂度。
  3. 因此,总的时间复杂度为O(N)。

代码分析:

代码中的解决思路是使用快慢指针来定位倒数第n+1个节点和倒数第n个节点,然后将倒数第n个节点移动到链表末尾。具体的步骤如下:

  1. 如果n为1,不需要移动,直接返回原链表。
  2. 创建一个前置头节点preHead,方便处理边界情况。
  3. 初始化快指针fast和慢指针slow,初始都指向preHead
  4. 快指针fast先向前移动N步,定位到倒数第n+1个节点。
  5. 快指针fast和慢指针slow同时向前移动,直到快指针到达链表尾部。此时慢指针指向倒数第n个节点。
  6. 将倒数第n个节点移动到链表末尾:先将slow.next节点删除,然后将该节点的next指针设为null,最后将fast.next指向该节点。
  7. 返回移动后的链表头节点。

代码:

import java.util.*;

class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}

public class Solution {
    /**
     * 将链表的倒数第N个节点移动到末尾
     *
     * @param head ListNode类 链表的头节点
     * @param n int整型 移动到末尾的倒数第N个节点
     * @return ListNode类 移动后的链表头节点
     */
    public ListNode moveNthToEnd(ListNode head, int n) {
        // 如果n为1,不需要移动,直接返回原链表
        if (n == 1) {
            return head;
        }

        // 创建一个前置头节点,方便处理边界情况
        ListNode preHead = new ListNode(-1);
        preHead.next = head;
        ListNode fast = preHead; // 快指针,用于定位倒数第N+1个节点
        ListNode slow = preHead; // 慢指针,用于定位倒数第N个节点

        // 快指针先向前移动N步
        for (int i = 0; i < n; i++) {
            fast = fast.next;
        }

        // 快指针和慢指针同时向前移动,直到快指针到达链表尾部
        while (fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }

        // 此时慢指针指向倒数第N个节点,将该节点移动到链表末尾
        ListNode target = slow.next;
        slow.next = slow.next.next;
        target.next = null;
        fast.next = target;

        // 返回移动后的链表头节点
        return preHead.next;
    }
}


全部评论

相关推荐

03-01 19:30
已编辑
南京大学 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
# AI面会问哪些问题? #
24898次浏览 491人参与
# 中国电信笔试 #
31099次浏览 283人参与
# 厦门银行科技岗值不值得投 #
7493次浏览 186人参与
# 你的实习产出是真实的还是包装的? #
18817次浏览 330人参与
# 如果秋招能重来,我会____ #
96697次浏览 500人参与
# 春招至今,你的战绩如何? #
59982次浏览 543人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
14151次浏览 209人参与
# i人适合做什么工作 #
36921次浏览 124人参与
# 我是面试官,请用一句话让我破防 #
79517次浏览 219人参与
# 哪些公司真双非友好? #
69205次浏览 287人参与
# 金三银四,你的春招进行到哪个阶段了? #
21572次浏览 277人参与
# 找AI工作可以去哪些公司? #
7694次浏览 186人参与
# 从事AI岗需要掌握哪些技术栈? #
7688次浏览 251人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
339915次浏览 2165人参与
# 面试尴尬现场 #
220759次浏览 861人参与
# 五一之后,实习真的很难找吗? #
102800次浏览 584人参与
# 你做过最难的笔试是哪家公司 #
30183次浏览 193人参与
# 你小时候最想从事什么职业 #
159843次浏览 2072人参与
# 应届生第一份工资要多少合适 #
20486次浏览 84人参与
# 阿里笔试 #
176493次浏览 1302人参与
# 一张图晒出你司的标语 #
3825次浏览 72人参与
# 面试被问期望薪资时该如何回答 #
382459次浏览 2163人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务