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;
}
}
查看17道真题和解析