在Is there a loop(上)中,咱们判断了一个单向链表有没有环,接下来咱们继续探索if有环,环的长度以及环的入口点。限于篇幅,再次不贴完整代码!oop
/******************************************************************** 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; }