Algorithm One Day One -- 判断链表是否有环(下)

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


相关文章
相关标签/搜索