删除链表的倒数第N个节点
学习文本来源:代码随想录
给你一个链表,删除链表的倒数第N个节点,并返回链表的头节点。
进阶:你能尝试使用一趟扫描实现吗?
示例1:
- 输入: head = [1,2,3,4,5],n=2
- 输出: [1,2,3,5]
示例2:
- 输入:head[1],n=1
- 输出:[]
示例3:
- 输入:head=[1,2] , 1
- 输出:[1]
思路
双指针的经典运用,如果要删除倒数第N个节点,让fast移动n步,然后让fast和slow同时移动,知道fast指向链表末尾。删掉slow所指向的节点就可以了。
思路是这样的,但是要注意一些细节。
分为如下几步:
- 首先这里我推荐大家使用虚拟头节点,这样方便处理删除实际头结点的逻辑。
- 定义fast指针和slow指针,初始值为虚拟头节点
- fast 先走n+1步,为什么是n+1呢?因为这样fast和slow的间隔就为n
- fast 和 slow 同时移动,知道fast指向末尾
- 删除slow指向的下个节点
此时不难写出代码:
goalng:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
virtual := &ListNode{Next:head}
slow := virtual
fast := virtual.Next
i:= 1
for fast != nil {
if i > n {
slow = slow.Next
}
fast = fast.Next
i++
}
slow.Next = slow.Next.Next
return virtual.Next
}