您的位置:首页 > 编程语言 > C语言/C++

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

2016-10-05 16:09 302 查看
哈哈,看着这个题目第一个想法就是先拿到单向链表的长度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();
}


结束!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐