Java 题解 | #调整牛群顺序#

调整牛群顺序

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

该题考察的仍然是链表的基础操作,即链表的指定位置节点移动到链表末尾。

在解决此问题时,首先需要理解题目要求,即将链表中的第n个节点移动到链表末尾。可以利用快慢指针的方法来解决。快指针先移动n步,然后同时移动快慢指针,直到快指针到达链表末尾。此时,慢指针指向的节点就是要移动的节点。通过交换节点的方式将目标节点移动到链表末尾。需要注意对边界条件和特殊情况的处理,例如链表为空或只有一个节点的情况。

  1. 根据函数定义,输入参数为一个头节点 head 和一个整数 n。
  2. 首先判断特殊情况,如果 n 的值为 1,表示要移动的是最后一个节点,直接返回原链表头节点 head。
  3. 创建一个新的辅助节点 preHead,将其指向 head,即 preHead.next = head。这样可以方便处理头节点的移动情况。
  4. 初始化两个指针 fast 和 slow,初始都指向 preHead。
  5. 使用 fast 指针将其移动到链表的第 n 个节点。
  6. 同时移动 fast 和 slow 指针,直到 fast 指针达到链表的末尾(即 fast.next 为 null)。
  7. 将倒数第 n 个节点移到链表末尾:将倒数第 n 个节点保存到变量 target 中。将 slow 的 next 指针指向倒数第 n 个节点的下一个节点,即跳过倒数第 n 个节点。将 target 的 next 指针设为 null,断开原链表中倒数第 n 个节点与后续节点的连接。将 target 插入到链表的末尾,即将 target 的 next 指针指向 fast 即可。
  8. 返回 preHead.next,即为调整后的链表头节点。

这段代码使用了双指针的思路来解决问题,时间复杂度为 O(L),其中 L 是链表的长度。

import java.util.*;

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

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

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

        // 将fast指针移动到链表的指定节点
        for (int i = 0; i < n; i++) {
            fast = fast.next;
        }

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

        //交换即可
        ListNode target = slow.next;
        slow.next = slow.next.next;
        target.next = null;
        fast.next = target;

        return preHead.next;
    }
}

全部评论

相关推荐

SinyWu:七院电话面的时候问我有没有女朋友,一听异地说你赶紧分。我:???
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务