題目描述
- 題目
- 給定一個鏈表,判斷鏈表中是否有環。
- 爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。
-
示例
-
示例 1:
輸入:head = [3,2,0,-4], pos = 1 輸出:true 解釋:鏈表中有一個環,其尾部連接到第二個節點。
-
示例二
輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個環,其尾部連接到第一個節點。
-
示例三
輸入:head = [1], pos = -1 輸出:false 解釋:鏈表中沒有環。
解題
哈希表版本
- 使用哈希map,將結點地址和出現的次數存儲起來(出現次數越多,其值越大)
- 在哈希表中查看是否存在出現次數大於1的,若有則說明鏈表中有環存在
代碼實現
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==nullptr){
return false;
}
if(head->next==nullptr){
return false;
}
unordered_map<ListNode*,int> map;
ListNode* cur=head;
while(cur){
map[cur]++;
if(map[cur]>1){
return true;
}
cur=cur->next;
}
return false;
}
};
快慢指針
- 跑步比賽採用圓形跑道,假設有兩個運動員不停的奔跑.且一個運動員跑得快,一個跑的慢,那麼兩個運動員肯定會有再次相遇的時候.
- 同樣的道理,定義兩個指針(一個一次移動1步,一個一次移動兩步),若鏈表中存在環形結構的話,那麼走到快的指針肯定會追上走的慢的指針.
代碼實現
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode* slow=head;
ListNode* fast=head;
while(fast&& fast->next){
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
return true;
}
return false;
}
};