Remove Nth Node From End of List

本文介绍了一种删除链表中倒数第N个节点的方法,并对比了传统双指针法。通过一次遍历获取链表长度,再次遍历定位目标节点并删除,实测效率不逊于双指针法。

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

难度:1

删除链表里倒数第n个节点

据说标准算法是两个指针,同时向右扫,相差n-1,当后面的没有后继时就找到了倒数第n个节点

我的算法很简单,从左到右扫一遍,记录个数num,再从头到尾移动num-n次,就找到该节点

题目说尽量只扫一次,我扫了两次,

但是如果我刚才说的标准算法真的是标准算法的话,

会分析复杂度的同学都知道两者的时间复杂度一样的,我的方法相比标准算法更简单明了(一切的前提是那个标准算法真的是标准算法的前提下)

我做了比较,

我的方法是36MS,所谓的标准算法是40MS,时间差不多,如果有更好的方法,请联系我!

class Solution 
{
public:
    ListNode *removeNthFromEnd(ListNode *head, int n) 
    {
        ListNode *p=head;
        int num=0;
        while(p)
        {
            num++;
            p=p->next;
        }
        if(num == n)
        {
            ListNode *ans=head->next;
            free(head);
            return ans;
        }
        num-=n;
        p=head;
        for(int i=0;i<num-1;i++)
        {
            p=p->next;
        }
        ListNode *tmp=p->next;
        p->next=p->next->next;
        free(tmp);
        return head;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值