在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;
}