題目相關
其實本題解報告已經在我 Blog 的雙指針算法介紹中出現精華內容,https://blog.csdn.net/justidle/article/details/106297779。
題目鏈接
LeetCode中國,https://leetcode-cn.com/problems/linked-list-cycle/。
題目描述
給定一個鏈表,判斷鏈表中是否有環。
爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。
示例
示例1
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點。
示例2
輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個環,其尾部連接到第一個節點。
示例3
輸入:head = [1], pos = -1
輸出:false
解釋:鏈表中沒有環。
進階
你能用 O(1)(即,常量)內存解決此問題嗎?
題目分析
LeetCode 給出本題難度簡單。是學習數據結構鏈表的基礎題目。
我們可以通過雙指針中的快慢指針來實現。
樣例數據分析
由於是經典題目,我們用圖示來分析兩個樣例數據,一個有環,一個無環,解釋快慢指針如何實現。
有環樣例數據
1、初始狀態。如下圖所示,慢指針(slow)和快指針(fast)指向第一個元素。
2、由於快指針(fast)沒有到最後。我們將慢指針(slow)向後移動一位,快指針(fast)向後移動兩位。如下圖所示。
3、由於慢指針(slow)和快指針(fast)不相等,或者快指針(fast)沒有到最後。我們將慢指針(slow)向後移動一位,快指針(fast)向後移動兩位。如下圖所示。
4、由於慢指針(slow)和快指針(fast)不相等,或者快指針(fast)沒有到最後。我們將慢指針(slow)向後移動一位,快指針(fast)向後移動兩位。如下圖所示。
5、如上圖所示,慢指針(slow)和快指針(fast)相等,說明有環。
無環樣例數據
1、初始狀態。如下圖所示,慢指針(slow)和快指針(fast)都指向第一個元素。
2、由於快指針(fast)沒有到最後。我們將慢指針(slow)向後移動一位,快指針(fast)向後移動兩位。如下圖所示。
3、由於慢指針(slow)和快指針(fast)不相等,或者快指針(fast)沒有到最後。我們將慢指針(slow)向後移動一位,快指針(fast)向後移動兩位。如下圖所示。
4、由於慢指針(slow)和快指針(fast)不相等,或者快指針(fast)沒有到最後。我們將慢指針(slow)向後移動一位,快指針(fast)向後移動兩位。如下圖所示。
5、如上圖所示,快指針(fast)已經到了鏈表的最後,鏈表的最後是用 NULL 來表示的。這樣說明該鏈表無環。
AC 參考代碼
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
//特例判斷
if (NULL==head) {
return false;
}
ListNode *slow = head;//慢指針
ListNode *fast = head;//快指針
while (NULL!=fast && NULL!=fast->next && NULL!=fast->next->next) {
//修改位置
slow = slow->next;
fast = fast->next->next;
//判斷有環
if (slow==fast) {
return true;
}
}
//無環
return false;
}
};