Java 题解 | #调整牛群顺序#
调整牛群顺序
https://www.nowcoder.com/practice/a1f432134c31416b8b2957e66961b7d4
该题考察的仍然是链表的基础操作,即链表的指定位置节点移动到链表末尾。
在解决此问题时,首先需要理解题目要求,即将链表中的第n个节点移动到链表末尾。可以利用快慢指针的方法来解决。快指针先移动n步,然后同时移动快慢指针,直到快指针到达链表末尾。此时,慢指针指向的节点就是要移动的节点。通过交换节点的方式将目标节点移动到链表末尾。需要注意对边界条件和特殊情况的处理,例如链表为空或只有一个节点的情况。
- 根据函数定义,输入参数为一个头节点 head 和一个整数 n。
- 首先判断特殊情况,如果 n 的值为 1,表示要移动的是最后一个节点,直接返回原链表头节点 head。
- 创建一个新的辅助节点 preHead,将其指向 head,即 preHead.next = head。这样可以方便处理头节点的移动情况。
- 初始化两个指针 fast 和 slow,初始都指向 preHead。
- 使用 fast 指针将其移动到链表的第 n 个节点。
- 同时移动 fast 和 slow 指针,直到 fast 指针达到链表的末尾(即 fast.next 为 null)。
- 将倒数第 n 个节点移到链表末尾:将倒数第 n 个节点保存到变量 target 中。将 slow 的 next 指针指向倒数第 n 个节点的下一个节点,即跳过倒数第 n 个节点。将 target 的 next 指针设为 null,断开原链表中倒数第 n 个节点与后续节点的连接。将 target 插入到链表的末尾,即将 target 的 next 指针指向 fast 即可。
- 返回 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; } }