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
}