找出有环链表中环的起始节点
来源:互联网 发布:手机慢动作软件 编辑:程序博客网 时间:2024/04/28 21:51
给定一个有环的链表,写一个算法,找出环的起点。
例如:
输入:A->B->C->D->E->C[与前面的C是同一个节点]
输出:C
判断一个链表是否存在环有一个简单的方法,就是使用一个快指针、和一个慢指针,快指针每次走两步,慢指针每次走一步,则如果有环,它们最后必然会相遇的。本题的难点在于要找出环的起点。其实也不难,与判断是否有环类似,用两个步长分别为1和2的指针遍历链表,直到两者相遇,此时慢指针走过的长度就是环的长度。另外相遇后把其中指针重新设定为起始点,让两个指针以步长1再走一遍链表,相遇点就是环的起始点。
证明也很简单,证明如下:
我们注意到第一次相遇时
慢指针走过的路程S1 = 非环部分长度 + 弧A长
快指针走过的路程S2 = 非环部分长度 + n * 环长 + 弧A长
S1 * 2 = S2,可得 非环部分长度 = n * 环长 - 弧A长
让指针A回到起始点后,走过一个非环部分长度,指针B走过了相等的长度,也就是n * 环长 - 弧A长,正好回到环的开头。
ListNode *findcyclehead(ListNode *head){ ListNode *mp=head; ListNode *kp=head; while(kp->next!=NULL && kp!=mp){ kp=kp->next->next; mp=mp->next; } if(kp->next==NULL) return NULL; mp=head; while(kp!=mp){ kp=kp->next; mp=mp->next; } return kp;}
0 0
- 找出有环链表中环的起始节点
- 找出有环链表中环的入口节点
- 找出环的初始节点
- 找出一个单向链表的起始位置
- Cracking the Coding Interview:: 寻找有环链表的环路起始节点
- 找出单链表的第一个公共节点
- 找出二叉树中距离给定节点为k的节点
- 找出二叉搜索树的最大节点和最小节点
- 找出二叉树中某个节点的所有祖先节点
- 找出BST上任意节点的下一个节点
- 找出二叉树中某个节点的所有祖先节点
- 判断一个单链表是否有环,如果有,找出环的起始位置 [No. 36]
- 判断一个单链表是否有环,如果有,找出环的起始位置
- 判断一个单链表是否有环,如果有,找出环的起始位置
- 算法7— 判断一个单链表是否有环,如果有,找出环的起始位置
- 笔试题:判断一个单链表是否有环,如果有,找出环的起始位置
- 递归法找出某节点的所有父节点直到根节点
- 无向图中节点的迭代得到从起始节点到结束节点之间的所有路径,并从中得到最短路径的节点
- 组装电脑
- Java数据结构之链表反转
- pc端测试webservice
- Android 如何建立AIDL
- 我的好妈妈
- 找出有环链表中环的起始节点
- CloudFoundry部署(四):CF部署
- 数据库sqlite3 创建 增 删 查 改 操作
- ArcGIS.Server.9.3和ArcGIS API for JavaScript地图实现Toorbar功能(四)
- 物联网成为黑客攻击目标,2013年全球有超过5.52亿个身份信息被泄露
- STM32的启动模式
- 静态代理和动态代理
- 关于IEEE PDf express检查
- sql的技巧语句