链表 - 删除链表倒数第N个节点
这里我们以力扣19题为例,讲讲如何删除链表倒数第二第N个节点
先明确,如果我们想删除数据4这个节点,是不是此时需要在数据3节点上?
假设我们现在在数据3上,接下来的操作就简单了: current.Next = current.Next.Next
现在问题来了,我们如何跳到倒数第n+1个节点呢?接来下大家看个图
看了这个图应该就不难理解了吧。大家按照这个图来操作就能得出题解。
还是老规矩,做链表的题最好使用虚拟头节点,方便操作。
这里还是对图解释一下
- 我们实际上定义了两个指针:快指针、慢指针
- 快指针最终一定会指向链表的最后一个节点
- 慢指针一定会指向链表中倒数第
n+1个节点
步骤:
- 初始化快慢指针:这里的初始化是将黄色的区间定义好
- 循环条件:因为
fast指针一定会落在链表的最后一个,所以判断fast.Next == nil就好。这里我们得取个反,因为只有fast.Next != nil的时候才需要不断移动slow和fast的位置
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
// 虚拟头节点
dummy := &ListNode{
Next: head,
}
slow, fast := dummy, dummy
for i := 0; i < n && fast != nil; i++{
fast = fast.Next
}
for fast.Next != nil {
slow = slow.Next
fast = fast.Next
}
slow.Next = slow.Next.Next
return dummy.Next
}