leetcode刷刷題(40) ---- 環形鏈表(C語言版)

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)。
  • 運行結果:
    在這裏插入圖片描述
他山之石:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章