题解 | #调整牛群顺序#

调整牛群顺序

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
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务