链表 - 删除链表倒数第N个节点

91 阅读1分钟

链表 - 删除链表倒数第N个节点

这里我们以力扣19题为例,讲讲如何删除链表倒数第二第N个节点

image.png

先明确,如果我们想删除数据4这个节点,是不是此时需要在数据3节点上?

假设我们现在在数据3上,接下来的操作就简单了: current.Next = current.Next.Next

现在问题来了,我们如何跳到倒数第n+1个节点呢?接来下大家看个图

image.png 看了这个图应该就不难理解了吧。大家按照这个图来操作就能得出题解。

image.png 还是老规矩,做链表的题最好使用虚拟头节点,方便操作。

这里还是对图解释一下

  1. 我们实际上定义了两个指针:快指针、慢指针
  2. 快指针最终一定会指向链表的最后一个节点
  3. 慢指针一定会指向链表中倒数第n+1个节点

步骤:

  1. 初始化快慢指针:这里的初始化是将黄色的区间定义好
  2. 循环条件:因为fast指针一定会落在链表的最后一个,所以判断fast.Next == nil就好。这里我们得取个反,因为只有fast.Next != nil的时候才需要不断移动slowfast的位置
/**
 * 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
}