浅析有关链表的带环问题
2017-07-16 12:25
218 查看
概要:
有关链表带环问题的面试题:
*判断一个链表是否带环?
*求环的长度?
*求环的入口点?
从相遇点的下一个节点开始遍历链表,每走一步统计一次,直到遇到相遇点就停止,统计的次数就是环的长度。
需要注意的是:因为是从相遇点的下一个节点开始遍历,所以计数器的初始值需要给1.
有关链表带环问题的面试题:
*判断一个链表是否带环?
*求环的长度?
*求环的入口点?
1、判断链表是否带环?
//判断一个链表是否带环 //思路:快慢指针,返回相遇点 Node* IsCircle(Node* head) { if (head == NULL) { return NULL; } Node* pFast = head; Node* pSlow = head; //快指针一次走两步,慢指针一次走一步 while (pFast && pFast->_next) { pFast = pFast->_next->_next; pSlow = pSlow->_next; if (pFast == pSlow) { break; } } if (pFast && pFast->_next) { return pFast; } return NULL; }
2、求环的长度?
若带环,求环的长度?从相遇点的下一个节点开始遍历链表,每走一步统计一次,直到遇到相遇点就停止,统计的次数就是环的长度。
需要注意的是:因为是从相遇点的下一个节点开始遍历,所以计数器的初始值需要给1.
size_t lengthOfCircle(Node* meetNode) { assert(meetNode); size_t count = 1;//注意初始值 Node* cur = meetNode->_next; while (cur != meetNode) { count++; cur = cur->_next; } return count; }
3、求环的入口点?
Node* GetEntryNode(Node* head, Node* meetNode) { assert(head && meetNode); Node* p1 = head; Node* p2 = meetNode; while (p1 != p2) { p1 = p1->_next; p2 = p2->_next; } return p1; }
相关文章推荐
- 有关单链表带环的问题
- day04之链表不带环相交+带环相交问题+fork函数输出几个短线
- 链表带环问题求解?是否带环,环的入口点,环长度
- 链表带环和相交的问题
- 有关链表环的问题
- 带环链表的几个问题
- 带环单链表及链表相交问题的分析及代码实现
- 链表面试题之带环问题
- 【每日一题-3】链表带环问题
- 判断链表中是否有环 ----- 有关单链表中环的问题
- 单链表中的一些经典问题--约瑟夫环,逆序,查找,复杂链表复制,链表带环问题
- 链表——带环问题
- 【单链表面试题】-----链表带环问题
- c/c++单链表面试题—链表带环问题
- 判断链表中是否有环 ----- 有关单链表中环的问题
- 链表面试题总结----(可能带环相交问题+复杂链表的复制)
- 判断链表中是否有环 ----- 有关单链表中环的问题
- c/c++单链表面试题—链表带环问题
- 链表带环的问题研究及代码实现
- 判断两个链表是否相交,若相交,求交点,若带环呢/fork继承问题