2020-3-27
- It’s easy to find if you know what you are looking for.
如果知道自己想追求什麼,找到目標就容易了。
題目:
給定一個鏈表,判斷鏈表中是否有環。
爲了表示給定鏈表中的環,我們使用整數 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
解釋:鏈表中沒有環。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/linked-list-cycle
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
個人解答:(C版本)
- 首先通過哪種值來判斷是否迴環?毋庸置疑,是每個節點的地址,這個是唯一的,也就是說當後面的節點指向前面的節點時,就是迴環。要記住前面每一個節點的地址,需要很多的內存才能夠實現。
- 所以想到一種做法,因爲每個節點都有一個值,我們可以在這個上做文章。從頭開始遍歷,我們讓第一個節點的值爲0,到第二節點的值時爲1,依次這樣下去。
在遍歷的過程中,我們不斷判斷即將遍歷的節點的值是多少,如果其值小於等於前一個節點的值且大於0(我們賦予的第一個節點的值),那麼這個值很有可能是迴環的節點,我們找到前面也是這個值的指針,然後比較兩者是否相等。
若相等,則說明迴環。
若不相等,繼續按之前的方式繼續遍歷,繼續累增賦值,最後找到迴環的點,或者找到NULL(說明不存在迴環)
詳細看下面的代碼。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
int i = 0;
struct ListNode *q = head;
if(NULL == q)
return false;
while(1)
{
q->val = i;
q = q->next;
if(NULL == q)
return false;
if((q->val <= i) && (q->val >= 0))
{
struct ListNode *p = head;
for(int j=0; j<(q->val); j++)
{
p = p->next;
}
if(p == q)
return true;
}
i++;
}
}
- 複雜度分析
1)循環套循環,所以該算法的時間複雜度爲O(n^2)。
2)由於只使用了少量的變量,空間複雜度爲O(1)。
- 運行結果: