判断单链表是否带环: 定义两个快慢指针,快指针每次走两步,慢指针每次走一步,然后判断是否两个指针相遇。若相遇,则带环。 设慢指针走过的路程为s,则快指针走过的路程即为2s。 设从环头结点到环的入口点的距离为a。 设从环的入口点到两指针相遇点的距离为x。 设环的长度为m。快指针走了n圈。 由数学关系式可得:s = a + x 2s = a + n*m + x; 则 n*m = a + x; a = n*m - x; 求环的入口点方法:定义连个指针,一个指针从环的头结点开始走,另一个指针则从之前快慢指针相遇点出发,两个指针相遇的地方即为入口点。 求环的长度,定义一个指针,指针从快慢指针相遇点出发再次到达相遇点走过的长度即为环的长度。 //判断是否带环 PLinkNode CheckCircle(PLinkNode& pHead) { LinkNode *fast = pHead; LinkNode *slow = pHead; while(fast && fast->_next != NULL) { fast = fast->_next ->_next; slow = slow->_next; if(fast == slow) { return slow; } } return NULL; } //求入口点 PLinkNode EntryNode(PLinkNode pHead,PLinkNode meet) { LinkNode *fast = meet; LinkNode *slow = pHead; while(1) { fast = fast->_next; slow = slow->_next; if(fast == slow) { return slow; } } } //求环的长度 int LenthCircle(PLinkNode pHead,PLinkNode meet) { LinkNode *begin = meet; LinkNode *src = begin; int count = 1; while(src->_next !=begin) { src = src->_next; count++; } return count; }
带环单链表
原创
©著作权归作者所有:来自51CTO博客作者小镇青苔的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
2.单链表逆置
单链表逆置
单链表逆置 List -
简单的尾插法实现单链表
尾插法建立单链表
结点 头结点 链表 -
关于相交链表、带环链表、链表深拷贝的思路整理
关于相交链表、带环链表、链表深拷贝的思路整理
关于相交链表、带环链表、链表深拷贝的思路 -
笔试,面试,C/C++,判断单链表是否带环?若带环,求环长度,求环入口点(两种方法)
笔试,面试,C/C++,判断单链表是否带环?若带环,求环长度,求环入口点(两种方法)
面试 笔试 C/C++ 单链表带环 链表环入口