查找一个单向链表中倒数第K个元素

哈哈,看着这个题目第一个想法就是先拿到单向链表的长度L,然后再一个一个地遍历,将第L-K+1个元素作为结果。
其实这个题这么做也没关系啊,但是我最终还是没有这么做。我额外想了两种解决方案,加上头脑一热的解决方案总共有三个:
一、获取单向链表的长度L,然后再一个一个地遍历,将第L-K+1个元素作为结果
二、将单向链表反向,然后获取第K个元素
三、维持一个长度为K的容器,遍历链表至链表尾,容器首元素即为所需元素

在分析这三个方案的优劣之前,我先把具体的要求列出来:
链表中每个元素是这样子的

template <typename T>
struct Node
{
    T val;
    Node *next;
    Node(const T& value):val(value),next(NULL){}
};

单向链表是这样子的:
Node *p_head;

so,这样子一来,获取链表长度就需要遍历整个链表了,然后若K很小,那就相当于将链表遍历两遍,时间上不划算。方案一放弃吧。
哦,方案二的话将整个链表反转,相当于遍历一遍,然后若K很大的话,那还是相当于将链表遍历两遍,而且反转单向链表比方案一可麻烦多了,放弃吧。
方案三的话可以只将链表遍历一遍,但是却要维护一个K大小的容器,如果K很大的话太浪费内存了。哎,谁教方案一和方案二都被否决了呢,那只好方案三硬着头皮上了。

实现如下:

T back_find(size_t k)
{
    list<T> arr;
    Node *p = p_head;
    while(p)
    {
        arr.push_back(p->val);
        if(arr.size() > k) arr.pop_front();
        p = p->next;
    }
    return arr.front();
}

结束!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值