哈哈,看着这个题目第一个想法就是先拿到单向链表的长度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();
}
结束!