题解 | #调整牛群顺序#
调整牛群顺序
https://www.nowcoder.com/practice/a1f432134c31416b8b2957e66961b7d4
package main import ( . "nc_tools" ) /* * type ListNode struct{ * Val int * Next *ListNode * } */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param n int整型 * @return ListNode类 */ // moveNthToEnd 将给定链表的倒数第 n 个节点移到链表的末尾。 // 参数 head 是链表的头节点,n 是要移动的节点的相对位置(倒数计数)。 // 返回调整后链表的新头节点。 func moveNthToEnd(head *ListNode, n int) *ListNode { if head == nil || n <= 0 { // 如果链表为空或 n 小于等于 0,直接返回原链表 return head } // 使用哑节点(dummy node)作为新链表的头节点,方便操作 dummy := &ListNode{Val: 0, Next: head} slow, fast := dummy, dummy // 初始化两个指针 slow 和 fast,都指向哑节点 // 让 fast 指针先向前移动 n 步 for i := 0; i < n && fast != nil; i++ { fast = fast.Next } // 如果 fast 为空,说明链表长度小于 n,直接返回头结点 if fast == nil { return head } // 同时移动 slow 和 fast 指针,直到 fast 指针到达链表末尾 for fast.Next != nil { slow = slow.Next fast = fast.Next } // fast 指针到达链表末尾,此时 slow 指针指向倒数第 n 个节点 // 如果 fast 和 slow 相等,说明 n 等于链表长度,无需移动节点,直接返回头结点 node := slow.Next if fast == node { return head } else { // 移除倒数第 n 个节点,将其从链表中断开 slow.Next = node.Next node.Next = nil // 将断开的节点放到链表末尾 fast.Next = node } // 返回哑节点的下一个节点作为调整后链表的新头节点 return dummy.Next }