Algorithm One Day One -- 判断链表是否有环(下)
2015-04-09 00:00
375 查看
在Is there a loop(上)中,我们判断了一个单向链表有没有环,接下来我们继续探索if有环,环的长度以及环的入口点。限于篇幅,再次不贴完整代码!
/******************************************************************** created:2015年1月23日 00:34:45 author: Jackery purpose: Is there a loop ? 《Continue》 *********************************************************************/ //计算环的长度 /*对于其中的stepfast与stepslow能与能相遇这个问题,不太好理解,涉及到 类似欧拉回路的问题,胡运权的运筹学上面有相关类似讲解,不过 你完全可以写个小demo去验证,对于这个换是奇数、偶数我都验证了 ,都是可行的*/ int LoopLength(pNode pHead) { if(isLoop(pHead) == false) return 0; pNode stepfast = pHead; pNode stepslow = pHead; int length = 0; bool begin = false; bool agian = false; while( stepfast != NULL && stepfast->next != NULL) { stepfast = stepfast->next->next; stepslow = stepslow->next; //超两圈后停止计数,跳出循环 if(stepfast == stepslow && agian == true) break; //超一圈后开始计数 if(stepfast == stepslow && agian == false) { begin = true; agian = true; } //计数 if(begin == true) ++length; } return length; } //求出环的入口点 Node* FindLoopEntrance(pNode pHead) { pNode stepfast = pHead; pNode stepslow = pHead; while( stepfast != NULL && stepfast->next != NULL) { stepfast = stepfast->next->next; stepslow = stepslow->next; //如果有环,则stepfast会超过stepslow一圈 if(stepfast == stepslow) { break; } } if(stepfast == NULL || stepfast->next == NULL) return NULL; stepslow = pHead; while(stepslow != stepfast) { stepslow = stepslow->next; stepfast = stepfast->next; } return stepslow; }
相关文章推荐
- Algorithm One Day One -- 判断链表是否有环(上)
- Algorithm One Day One -- 判断链表是否有环(下)
- Algorithm One Day One -- 判断链表是否有环(上)
- 剑指-判断一个单向链表是否形成了环形结构
- 如何判断链表中是否有环
- 【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点
- 判断一条单链表是否有环
- 判断链表是是否是回文
- LeetCode OJ 之 Linked List Cycle (判断链表是否有环)
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断链表是否有环
- 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述
- [leetcode 141] Linked List Cycle----判断链表是否为循环链表
- 编程判断俩个链表是否相交
- 判断一个链表是否为回文结构
- LeetCode基础-链表-判断链表是否有环
- 判断链表是否有环
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 编写一个函数实现对单链表是否有环的判断
- 如何判断链表是否有环