删除链表的倒数第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
}
Last modification:May 28, 2024
如果觉得我的文章对你有用,请收藏本站