19.删除链表的倒数第N个节点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1 输出:[]

示例 3:

输入:head = [1,2], n = 1 输出:[1]

提示:

链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz

解题思路:

这个问题可以用双指针技巧来解决。
我们可以使用两个指针,一个快指针 fast 和一个慢指针 slow,它们都指向链表的头节点。

  • 首先,我们将 fast 指针向前移动 n 个节点。
  • 然后,同时移动 fast 和 slow 指针,直到 fast 指针到达链表末尾。
  • 此时,slow 指针将指向倒数第 n 个节点的前一个节点。我们只需要将 slow 指针的 next 指针指向 slow.next.next 即可删除倒数第 n 个节点。 特殊情况处理:
  • 如果链表只有一个节点,而 n = 1,我们需要返回空链表。
  • 如果 n 等于链表的长度,我们需要删除头节点。
func removeNthFromEnd(head *ListNode, n int) *ListNode {
 	dummy := &ListNode{
 		Val:  0,
 		Next: head,
 	}
 	fast, slow := dummy, dummy
 
 	// 注意:n+1步,前面引入了哑结点
 	for i := 0; i <= n; i++ {
 		fast = fast.Next
 	}
 
 	for fast != nil {
 		fast = fast.Next
 		slow = slow.Next
 	}
 
 	slow.Next = slow.Next.Next
 	return dummy.Next

}