判断单链表是否带环?若带环,求环的长度,求环的入口点

判断是否带环,若带环返回相遇点,否则返回空(快慢指针法) 

pNode IsCircle(pList plist)
{
	pNode pFast = plist;
	pNode pSlow = plist;
	while (pFast && pFast->next)//终止条件是为了保证快指针能够走两步
	{
		pFast = pFast->next->next;
		pSlow = pSlow->next;
		if (pFast == pSlow)
		{
			return pFast;
		}
	}
	return NULL;
}

求环的长度

int GetCircleLen(pList plist)
{
	//1.判断是否带环
	pNode pMeetNode = IsCircle(plist);
	pNode pCur = pMeetNode;
	int count = 1;//这里count不能为0
	if (pMeetNode == NULL)//如果不带环,则环的长度为0
	{
		return 0;
	}
	//2.程序走到这里说明一定带环,用遍历的方法求环的长度
	while (pCur->next != pMeetNode)
	{
		count++;
		pCur = pCur->next;
	}
	return count;
}

 求环的入口点

一个指针从表头开始走,一个指针从相遇点开始走,当两指针指向同一结点时,则这个结点就为入口点

pNode GetEnterNode(pList plist, pNode pMeetNode)
{
	pNode pH = plist;//pH从链表头开始走
	pNode pM = pMeetNode;//pM从相遇点开始走
	if (plist == NULL || pMeetNode == NULL)
	{
		return NULL;
	}
	while (pH != pM)
	{
		pH = pH->next;
		pM = pM->next;
	}
	return pH;
}

猜你喜欢

转载自blog.csdn.net/weixin_40995778/article/details/82832960