题解 | #调整牛群顺序#

调整牛群顺序

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

题目考察的知识点:链表、双指针。

题目解答方法的文字分析:这道题目给定了一个链表,表示农场里一群牛,每头牛都有一个编号,编号由一个整数表示,整数范围是[0, 100]。我们需要将链表中的倒数第n个结点移到链表的末尾,并返回调整后的链表的头结点。

为了解决这个问题,我们可以使用双指针的方法。首先,我们引入一个dummy节点,它的作用是方便处理链表的头节点。然后,我们定义两个指针fastslow,同时将它们指向dummy节点。我们先将fast指针向前移动n步,以找到倒数第n个结点的位置。

接下来,我们同时移动fastslow指针,直到fast指针到达链表的末尾。此时,slow指针就指向了倒数第n个结点的前一个结点。我们通过这个方法可以将倒数第n个结点移到链表末尾。

具体步骤如下:

  1. 初始化dummy节点,将fastslow指针都指向dummy节点。
  2. fast指针向前移动n步,找到倒数第n个结点的位置。
  3. 同时移动fastslow指针,直到fast指针到达链表的末尾,slow指针就指向了倒数第n个结点的前一个结点。
  4. 将倒数第n个结点移到链表末尾,即将其从链表中删除,并添加到链表的末尾。

最后,我们返回调整后的链表的头结点,即dummy.next

本题解析所用的编程语言:Java

完整且正确的编程代码如下:

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @param n int整型
     * @return ListNode类
     */
    public ListNode moveNthToEnd (ListNode head, int n) {
        if (head == null || n <= 1) {
            return head;
        }

        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode fast = dummy;
        ListNode slow = dummy;

        // 将fast指针向前移动n步
        for (int i = 0; i < n; i++) {
            if (fast == null) {
                return head; // 链表长度小于n,直接返回原链表
            }
            fast = fast.next;
        }

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

        // 将倒数第n个结点移到链表末尾
        ListNode nthNode = slow.next;
        slow.next = slow.next.next;
        nthNode.next = null;

        // 将倒数第n个结点添加到链表末尾
        ListNode curr = dummy;
        while (curr.next != null) {
            curr = curr.next;
        }
        curr.next = nthNode;

        return dummy.next;
    }
}

全部评论

相关推荐

在秋招的河老师很爱吃:40岁失业 假如22岁开始工作 18年前 2007年那个时候如何 2015年开始互联网爆发 这个时候有了8年经验 然后黄金10年 你想想这些年挣了多少 这要是进的时候某个大厂 这辈子根本花不完了
你找实习最大的坎坷是什么
点赞 评论 收藏
分享
xiaolihuam...:当然还有一种情况是你多次一面挂,并且挂的原因都比较类似,例如每次都是算法题写不出来。面试官给你的评价大概率是算法能力有待加强,算法能力有待提高,基础知识掌握的不错,项目过关,但是coding要加强。短期内高强度面试并且每次都是因为同样的原因挂(这个你自己肯定很清楚),会形成刻板印象,因为你偶尔一次算法写不出来,面试官自己也能理解,因为他清楚的知道自己出去面试也不一定每一次面试算法都能写出来。但是连续几次他发现你的面屏里面都是算法有问题,他就认为这不是运气问题,而是能力问题,这种就是很客观的评价形成了刻白印象,所以你要保证自己。至少不能连续几次面试犯同样的错。算法这个东西比较难保证,但是有些东西是可以的,例如某一轮你挂的时候是因为数据库的索引,这个知识点答的不好,那你就要把数据库整体系统性的复习,下一轮面试你可以,项目打的不好,可以消息队列答的不好,但是绝对不可以数据库再答的不好了。当然事实上对于任何面试都应该这样查漏补缺,只是对于字节来说这个格外重要,有些面试官真的会问之前面试官问过的问题
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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