快慢指针及其应用
2016-08-30 09:36
204 查看
快慢指针,顾名思义就是设置两个指针,在同一个链表中不同步的游走。快指针每次走两步,慢指针每次走一步,如果链表不是循环链表,那么快指针会始终在慢指针前面,如果链表存在环路,那么当进入环中以后,由于快指针移动较快,它与慢指针总会有相遇的时刻。就如同我们在环形跑道上跑步一样,速度快的人在跑若干圈之后会再次追上速度慢的人,再次相遇。因此本节我们介绍如何利用快慢指针来判断一个链表是否存在环并返回环开始的结点。
从上面的分析我们知道要判断是否存在环是比较容易的,那么如何找到并返回环开始的结点呢,具体请看这篇文章的数学推导(参考),那么最终的结论是:当快慢指针第一次在环内的某一结点处相遇时,令其中一个指针指向链表的头结点,然后二者同步移动,每次都只移动一步,最终再次相遇的地方即为环的开始结点。
从上面的分析我们知道要判断是否存在环是比较容易的,那么如何找到并返回环开始的结点呢,具体请看这篇文章的数学推导(参考),那么最终的结论是:当快慢指针第一次在环内的某一结点处相遇时,令其中一个指针指向链表的头结点,然后二者同步移动,每次都只移动一步,最终再次相遇的地方即为环的开始结点。
node* loopStart(node* head) { if(!head) return NULL; node* slow = head; node* fast = head; while(fast && fast->next) { fast = fast->next->next; slow = slow->next; if(fast == slow) break; } if(!fast || !fast->next) return NULL; fast = head; while(fast != slow) { fast = fast->next; slow = slow->next; } return fast; }
相关文章推荐
- SSE指令介绍及其C、C++应用
- WINDOWS键盘事件的挂钩监控原理及其应用技术
- EJB核心技术及其应用
- EJB核心技术及其应用(转载)
- Turbo码简介及其在第三代移动通信中的应用
- 视频会议系统及其应用
- 认识class Class及其应用
- [技术概述]移动流媒体技术及其应用(转载)
- 射频技术系列谈:射频技术及其在供应链管理中的应用之一
- 三层C/S结构及其应用开发
- 动态建立弹出式菜单技术及其应用示例
- Hook及其应用
- EJB核心技术及其应用
- 动态建立弹出式菜单技术及其应用示例
- 一道 SQL 题 ... (关于树型结构的在关系表中的存储及其应用处理)
- 软件相关技术及其在国内的应用
- 简单对象访问协议SOAP及其应用
- 简单对象访问协议SOAP及其应用
- AOP及其在Spring中的应用(一)
- EJB核心技术及其应用(转)