单链表的一些经典面试题
2016-05-24 15:27
381 查看
今天在一本试题书上看到一些特别好的单链表面试题,大家都知道单链表容易在头节点处进行删除,在尾节点处进行插入,下面我们就来讨论一下这些面试题:
(一)删除一个非尾节点:
题目要求的是要删除一个不是尾节点的节点,要删除一个节点我们首先得知道是那个链表,是哪个节点节点,找到并且删除它。所以我们设计的函数是这样的:
(三)判断一个链表是否带环,若带返回环的入口点(较难)
上面已经说过,通过快慢指针可以找到单链表中的任何节点,这也是通过验证的。那么原理上也可以判断链表是否带环:
如果带环,快慢指针一定会在某个节点处相遇。(fast一直在环里转,总有一个时刻,slow追上fast,相遇)
(一)删除一个非尾节点:
题目要求的是要删除一个不是尾节点的节点,要删除一个节点我们首先得知道是那个链表,是哪个节点节点,找到并且删除它。所以我们设计的函数是这样的:
(二)找到单链表的中间节点: 题目要求只遍历一次就找到这个中间节点,可见按照我们的常规思路,先遍历一遍计数节点的总个数,然后二遍遍历直接找到节点是不行的。这就用到了单链表一个重要的概念——快慢指针。定义两个指针slow和fast,slow指针每次往后走一个节点位置,fast指针每次往后走俩个节点位置,当fast指针走到尾节点时,slow指针刚刚好走到中间节点位置; [code]SListNode* FindMidNode(SListNode* pHead)//pHead是链表的头节点 { SListNode* fast = pHead; SListNode* slow = pHead; while (fast->next) { slow = slow->next; fast = fast->next; if (fast->next) { fast = fast->next; } else { break; } } return slow; }利用快慢指针可以解决很多类似的问题,比如找到单链表的第N个节点,或者判断链表是否带环等等,下面会有列子。
(三)判断一个链表是否带环,若带返回环的入口点(较难)
上面已经说过,通过快慢指针可以找到单链表中的任何节点,这也是通过验证的。那么原理上也可以判断链表是否带环:
如果带环,快慢指针一定会在某个节点处相遇。(fast一直在环里转,总有一个时刻,slow追上fast,相遇)
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/7E/D8/wKioL1cLCqHj9J0ZAAAniQxmoSI321.png" title="捕获3.PNG" alt="wKioL1cLCqHj9J0ZAAAniQxmoSI321.png" /> 如果链表带环的话,我们就可以求出相遇的节点。然后从相遇节点处断开带环链表,一个指针从链表投节点处开始往后遍历,一个指针从断开处往后遍历,相遇节点处就是环的入口点 650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/7E/D8/wKioL1cLCsSilsa_AAAWbXfqfZg674.png" title="捕获4.PNG" alt="wKioL1cLCsSilsa_AAAWbXfqfZg674.png" />SListNode* GetEnterNode(SListNode* pHead)//找到链表环入口节点在哪(重点) { SListNode* start = pHead; SListNode* tmp = WhetherRing(pHead); while (start != tmp) { start = start->next; tmp = tmp->next; } return start; }这就是单链表的一些面试经典题,我通过理解后和大家一起分享,希望对大家有些许帮助。
相关文章推荐
- 程序员美食-煎豆腐
- 编程面试的10大算法概念汇总
- 2016年Java 面试题总结
- Android 程序员需要的 ps 技巧
- 面试必备-快速排序(Java)
- 招聘一个靠谱的iOS面试题
- 面试必备-快速排序
- Android 面试题总结之Android 基础(五)
- 黑马程序员认为:iOS开发者的春天即将到来
- Android面试题大集结
- 做程序员就要打好基础
- 面试题15:单链表中倒数第k个节点
- Android程序员在Mac上开发常用的软件
- iOS开发 - 几道面试题
- 何为有价值的程序员,写得不错
- 树的子结构
- 开发者应警惕的七种糟糕职业规划错误
- 面试题—链表的‘部分’翻转
- 反转链表
- GCD的使用和面试题集锦