141.環形鏈表
題目
給定一個鏈表,判斷鏈表中是否有環。爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。
這裏的pos和解題沒啥關係,是leetcode測試用的。
示例
示例 1:
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點。示例 2:
輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個環,其尾部連接到第一個節點。
示例 3:
輸入:head = [1], pos = -1
輸出:false
解釋:鏈表中沒有環。
思路
這個題目的pos寫的很迷惑哈哈,還以爲鏈表給了末尾結點的值呢,如果pos等於-1就無環,其他值就有環。寫完發現不對纔看的題解,原來題目的意思就是讓判斷是不是有環的鏈表。
這裏發現了一個很有意思的思路,即快慢指針
假設有快慢兩個運動員,快的運動員一次跑兩步,慢的運動員一次跑一步,如果跑道是圓環的,那麼第二圈的時候一定會相遇,如果是直線的就不會相遇。以兩個運動員是否相遇作爲有環和無環的判斷條件。
代碼
/**
* 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(head==NULL)
return false;
ListNode* fast{ head };//快指針
ListNode* slow{ head };//慢指針
while(fast->next!=NULL&&fast->next->next!=NULL)
{
fast=fast->next->next;//快的運動員一次跑兩步
slow=slow->next;//慢的運動員一次跑一步
if(fast==slow)//如果相遇代表有環
return true;
}
return false;
}
};
昨天說的要開始看論文了,可惜今天學校雲開課有五節課,還要改師兄的論文圖,感覺是沒時間看論文了。有想法把看論文的筆記也放在csdn上更新,編輯起來還是比較方便的。