1. 程式人生 > 實用技巧 >【LeetCode】141. 環形連結串列

【LeetCode】141. 環形連結串列

【題目描述】

給定一個連結串列,判斷連結串列中是否有環。

為了表示給定連結串列中的環,我們使用整數 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

【解題思路】

快慢指標技巧:

通過使用具有 不同速度 的快、慢兩個指標遍歷連結串列。慢指標每次移動一步,而快指標每次移動兩步。

如果連結串列中不存在環,最終快指標將會最先到達尾部,此時我們可以返回 false。

如果連結串列中存在環,則快指標和慢指標最終會相遇,即快指標等於慢指標,此時我們返回true。

【提交程式碼】

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
5 * struct ListNode *next; 6 * }; 7 */ 8 bool hasCycle(struct ListNode *head) { 9 struct ListNode *fast; 10 struct ListNode *slow; 11 12 if( head == NULL || head->next == NULL ) 13 return false; 14 15 fast = head->next; 16 slow = head; 17 while( fast != slow )
18 { 19 if( fast == NULL || fast->next == NULL ) 20 return false; 21 22 fast = fast->next->next; 23 slow = slow->next; 24 } 25 26 return true; 27 }