轉載: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; }