【力扣笔记】19.删除链表的倒数第k个元素

这篇博客详细介绍了如何解决LeetCode中的19题,即删除链表的倒数第k个元素。文章讨论了两种解法,包括扫描两轮和扫描一轮,并解释了快慢指针逻辑以及虚拟头结点的使用。同时,提供了使用C++实现的代码示例,强调了在解题过程中的一些关键点和时间复杂度考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总览

思维导图总览

解法1 扫描两轮

扫描两轮逻辑

解法2 扫描一轮

快慢指针逻辑

快慢指针原理是设计两个指针,初始位置都在头结点处,如下图所示方法遍历一轮后,慢指针位置可以到达倒数第k位(但本题要找倒数第k+1位)。
快慢指针

虚拟头结点的使用

对不带头结点的链表使用虚拟头结点:

//虚拟头结点
        ListNode* vp=new ListNode();
        vp->next=head;

好处如下:
使用vp的好处

cpp代码

代码展示:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        //虚拟头结点
        ListNode* vp=new ListNode();
        vp->next=head;
        //快慢指针
        ListNode* slow=vp;
        ListNode* fast=vp;
        //删除倒数第n,要找到倒数第n+1
        //对于只有n个节点的链表,访问倒数第n+1会访问空指针,因此此题快慢指针初始位置为虚拟头结点vp
        for(int i=0;i<n+1&&fast!=NULL;i++){
            fast=fast->next;
        }
        while(fast!=NULL){
            fast=fast->next;
            slow=slow->next;
        }
        //删除操作
        slow->next=slow->next->next;
        return vp->next;
    }
};

值得注意的是:
1.未进行delete操作力扣不会不让过,甚至可以缩减运行时间。
2.虽然扫描一轮理论上时间复杂度更低,但是本题力扣统计运行时间更少的算法是扫描两轮。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值