题解 | #调整牛群顺序#
调整牛群顺序
https://www.nowcoder.com/practice/a1f432134c31416b8b2957e66961b7d4
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 || head.next == null) { return head; } //避免倒数第N个节点是头节点,采用头插法插入一个虚拟节点 ListNode res = new ListNode(-1); res.next = head; ListNode p1 = res.next; ListNode p2 = res.next; //记录倒数第N个节点的前一个节点 ListNode pre = res; //通过快慢指针,先让快指针走N步 for (int i = 1; i < n; i++) { p1 = p1.next; } //如果快指针没有走到链表尾部,慢指针和快指针一起走直到快指针走到链表尾部,则P2则指向的是倒数第N个节点 while (p1.next != null) { p1 = p1.next; pre = p2; p2 = p2.next; } if (p1 == p2) { //说明倒数第N个节点是最后一个节点,无需移动 return head; } //修改倒数第N个节点前一个节点的指向 pre.next = p2.next; //最后一个节点指向倒数第N个节点 p1.next = p2; //把移动后的节点指为null p2.next = null; return res.next; } }#链表调整顺序#