您的位置:首页 > 其它

判断链表是否带环?若带环求环的长度?若带环求环的入口点?并计算以上每个问题的时间复杂度?

2017-07-17 22:00 309 查看
1、怎么判断一个单链表是否带环

         如果单链表带环,那么从链表头开始时遍历就会进入死循环。可以用两个速度不同的指针,先让两个指针pFast和pSlow同时指向pHead,然后每次使pFast走两步,使pSlow走一步,只要链表带环,那么pFast和pSlow总会相遇。

// 判断链表是否带环,若带环给出相遇点
PNode HasCircle(PNode pHead)
{
PNode pFast = NULL;
PNode pSlow = NULL;
if(pHead == NULL)
return NULL;
pFast = pHead;
pSlow = pHead;
while(pFast && pFast->_pNext)
{
pFast = pFast->_pNext->_pNext;
pSlow = pSlow->_pNext;
if(pFast == pSlow)
return pFast;
}
return NULL;
}


2、如果带环,环的长度怎么计算:

          我们可以得到pFast和pSlow的第一次相遇点,把它标记起来,给一个计数器count,让它初始为1,然后让临时指针pCur向后走,每走一次count+1,等到它们再次相
aa9a
遇的时候,得到的count就是环的长度。

// 求环的长度
size_t  GetCircleLen(PNode pMeetNode)
{
size_t count = 1;
PNode pCurNode = NULL;
if(pMeetNode == NULL)
return 0;
pCurNode = pMeetNode->_pNext;
while(pCurNode != pMeetNode)
{
pCurNode = pCurNode->_pNext;
count++;
}
return count;
}


3、如果带环,怎么求环的入口:

得到第一次相遇点pMeetNode后 ,分别在表头和相遇点放一个指针,两个指针每次都向后走一步,下一次相遇的点就是环的入口点。

// 求环的入口点
PNode GetEnterNode(PNode pHead, PNode pMeetNode)
{
if(pHead == NULL || pMeetNode == NULL)
return NULL;
while(pHead != pMeetNode)
{
pHead = pHead->_pNext;
pMeetNode = pMeetNode->_pNext;
}
return pHead;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐