判断是否带环,若带环返回相遇点,否则返回空(快慢指针法)
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;
}