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

题目描述

思路
解决这道题目我们不需要使用 Map 或是额外的数据结构对链表当中的节点顺序进行维护,只需要知道当前链表的长度并新建一个dummyNode并令dummyNode.Next = head,即可解决本题。
具体来说,我们先对链表进行一次遍历以统计链表的长度,假定是length,length - n这个位置所对应的节点(从1开始,针对示例 1,这个节点就是从前数第三个节点,其值为3)就是我们需要删除的节点的前序节点。
我们令p, q := dummyNode, head,同时将它们向后移动length - n次,发现p所在的位置就是第三个节点,q所在的位置就是要删除的第四个节点(倒数第二个节点)。此时令p.Next = q.Next并返回dummyNode.Next即可解决问题。
Golang 题解
go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
length := 0
p := head
for p != nil {
length ++
p = p.Next
}
dummyNode := new(ListNode)
dummyNode.Next = head
p, q := dummyNode, head
for i := 0; i < length - n; i ++ {
p, q = p.Next, q.Next
}
p.Next = q.Next
return dummyNode.Next
}