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

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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值