查找一个单向链表中倒数第K个元素
2016-10-05 16:09
302 查看
哈哈,看着这个题目第一个想法就是先拿到单向链表的长度L,然后再一个一个地遍历,将第L-K+1个元素作为结果。
其实这个题这么做也没关系啊,但是我最终还是没有这么做。我额外想了两种解决方案,加上头脑一热的解决方案总共有三个:
一、获取单向链表的长度L,然后再一个一个地遍历,将第L-K+1个元素作为结果
二、将单向链表反向,然后获取第K个元素
三、维持一个长度为K的容器,遍历链表至链表尾,容器首元素即为所需元素
在分析这三个方案的优劣之前,我先把具体的要求列出来:
链表中每个元素是这样子的
单向链表是这样子的:
Node *p_head;
so,这样子一来,获取链表长度就需要遍历整个链表了,然后若K很小,那就相当于将链表遍历两遍,时间上不划算。方案一放弃吧。
哦,方案二的话将整个链表反转,相当于遍历一遍,然后若K很大的话,那还是相当于将链表遍历两遍,而且反转单向链表比方案一可麻烦多了,放弃吧。
方案三的话可以只将链表遍历一遍,但是却要维护一个K大小的容器,如果K很大的话太浪费内存了。哎,谁教方案一和方案二都被否决了呢,那只好方案三硬着头皮上了。
实现如下:
结束!
其实这个题这么做也没关系啊,但是我最终还是没有这么做。我额外想了两种解决方案,加上头脑一热的解决方案总共有三个:
一、获取单向链表的长度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(); }
结束!
相关文章推荐
- 每天一道算法题7 查找链表中倒数第k个结点 ; 输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个
- java实现单向链表CRUD,反转,排序,查找倒数第k个元素,递归输出等操作
- 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针
- 查找链表中倒数第k个节点元素
- 每天学习一算法系列(13) (输入一个单向链表,输出该链表中倒数第k个结点)
- 给出一个单向链表的头指针,输出该链表中倒数第K个节点的指针
- 13、输入一个单向链表,输出该链表中倒数第k个结点
- 数据结构——算法之(004)(输入一个单向链表,输出该链表中倒数第k个结点)
- 单链表的创建(头插尾插),表长,输出,插入,删除,查找,逆置,分解长两个链表(奇数偶数链表),查找倒数第k个元素,产出相同元素
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- 微软面试之13 输入一个单向链表 输出该链表的倒数第k个节点
- 输入一个单向链表,输出该链表中倒数第k个结点
- 查找单向链表倒数第n个元素
- 求一个链表中倒数第K个元素(2009年计算机硕士研究生全国入学考试统考大题第1题)
- 查找单链表中倒数第k个元素
- 程序员面试100题(算法)之查找链表中倒数第k个节点(含单向链表的创建和打印)
- [java 面试100道]13.输入一个单向链表,输出该链表中倒数第k个结点。
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 面试题:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。
- 尾插法、头插法创建链表、链表反转、链表分段反转、查找链表倒数第k个元素,查找链表中间元素