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

来源:互联网 发布:网络用语开屏 编辑:程序博客网 时间:2024/06/06 02:09

1、怎么判断一个单链表是否带环

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

// 判断链表是否带环,若带环给出相遇点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、如果带环,环的长度怎么计算:

          我们可以得到pFastpSlow的第一次相遇点,把它标记起来,给一个计数器count,让它初始为1,然后让临时指针pCur向后走,每走一次count+1,等到它们再次相遇的时候,得到的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;}


阅读全文
0 0