转载:https://blog.csdn.net/donghuaan/article/details/78988987ide
问题:oop
给定一个链表: 1. 判断链表是否有环。 2. 若是链表有环,请找出环入口。 3. 计算环的大小。
思路:快慢指针
分别定义一个快指针fast和慢指针slow,快指针一次走两步,慢指针一次走一步。若是链表没有环,那么fast最终会指向nullptr;若是链表有环,那么快指针和慢指针最终会相遇。因此,若是最终fast == nullptr,那么判断链表无环;若是最终fast == slow,且fast != nullptr,那么链表有环。.net
第三步:慢指针进入环中。由于快指针每次都比慢指针快一步,因此,快慢指针最后必定会相遇。【证实了必然会相遇】指针
核心代码code
寻找环入口 LLNode * LinkedList::entranceOfLoop() { LLNode * slow = pHead; LLNode * fast = pHead; while(fast && fast->pNext) { fast = fast->pNext->pNext; slow = slow->pNext; if(fast == slow) break; } if(!fast || !fast->pNext) return nullptr; fast = pHead; while(fast != slow) { fast = fast->pNext; slow = slow->pNext; } return fast; }
计算环大小blog
int LinkedList::sizeOfLoop() { LLNode * slow = pHead; LLNode * fast = pHead; while(fast && fast->pNext) { fast = fast->pNext->pNext; slow = pNext; if(fast == slow) break; } if(!fast || !fast->pNext) return 0; int size = 1; fast = fast->pNext->pNext; slow = slow->pNext; while(fast != slow) { ++size; fast = fast->pNext->pNext; slow = slow->pNext; } return size; }