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

代码参考:

package main

import "fmt"

func main() {
    fmt.Println(removeNthFromEnd(newList([]int{1, 2}), 1))
    // fmt.Println(removeNthFromEnd(newList([]int{1, 2}), 2))
}

// 和倒数相关的问题考虑天生有间距的"双指针",一次遍历解决
// 借助哑节点是关键,用于防止删除倒数第 len(nums) 个节点会导致链表丢失
// 若要兼顾正常节点的移动,又要处理头结点的特殊情况,请考虑"哑节点"
func removeNthFromEnd(head *ListNode, n int) *ListNode {
    dummyNode := &ListNode{Val: 0, Next: head}
    front, rear := dummyNode, dummyNode
    for counts := 0; counts <= n; counts++ {
        rear = rear.Next
    }
    for rear != nil {
        front = front.Next
        rear = rear.Next
    }
    front.Next = front.Next.Next // 删除节点
    return dummyNode.Next
}
最后编辑: kuteng  文档更新时间: 2021-06-05 10:16   作者:kuteng