判断单链表是否带环: 定义两个快慢指针,快指针每次走两步,慢指针每次走一步,然后判断是否两个指针相遇。若相遇,则带环。 设慢指针走过的路程为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; }
时间: 2024-12-25 01:33:14