LeetCode題解——141. 環形鏈表

題目相關

其實本題解報告已經在我 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;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章