判斷乙個單鏈表是否有環,如果有,找出環的起始位置

2021-06-08 04:10:23 字數 794 閱讀 4598

第一種方法是從單鏈表head開始,每遍歷乙個,就把那個node放在hashset裡,走到下乙個的時候,把該node放在hashset裡查詢,如果有相同的,就表示有環,如果走到單鏈表最後乙個node,在hashset裡都沒有重複的node,就表示沒有環。 這種方法需要o(n)的空間和時間。

第二種方法是設定兩個指標指向單鏈表的head, 然後開始遍歷,第乙個指標走一步,第二個指標走兩步,如果沒有環,它們會直接走到底,如果有環,這兩個指標一定會相遇。方法二的實現**如下,程式中

找出了環的起始位置:

node* first_loop_port(node *head)

if (fast == null || fast->next == null)

return null;

slow = head;

while (slow != fast)

return slow;

}

這裡用到了乙個巧妙的處理方法:

假設環長為l,起始點到環入口長度為a,環長度為r,設慢指標和快指標相遇前,慢指標在環內走了x步(快指標已經走了n圈),同時假設慢指標已經走了s步,則快指標走了2s步。

則有:2s = s + n r   ;則s = nr;

又 a + x  = s;故a+x = nr = (n-1)r+r = (n-1)r + l-a;則a = (n-1)r + l-a-x;含義為環入口距離起點的距離和相遇點距離環入口點的距離相等。

故讓慢指標回到起點,快指標從相遇點開始繼續走,當兩者相等時,則為環入口位址。

【**

判斷鍊錶是否有環,如果有,找到環的入口位置

判斷乙個鍊錶是否有環,空間複雜度是o 1 如果不考慮空間複雜度,可以使用乙個map記錄走過的節點,當遇到第乙個在map中存在的節點時,就說明回到了出發點,即鍊錶有環,同時也找到了環的入口。不適用額外記憶體空間的技巧是使用快慢指標,即採用兩個指標walker和runner,walker每次移動一步而r...

如何判斷乙個鍊錶是否有環,如果有環,並找出環的入口

首先如何判斷乙個鍊錶是否有環 設定兩個指標 fast,slow 初始值都指向頭,slow 每次前進一步,fast 每次前進二步,如果鍊錶存在環,則 fast 必定先進入環,而 slow 後進入環,兩個指標必定相遇。當然,fast 先行頭到尾部為 null 則為無環鏈表 程式如下 bool i its...

判斷乙個單鏈表是否有環

一 判斷鍊錶是否存在環 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入 環,而slow後進入環,兩個指標必定相遇。當然,fast先行頭到尾部為null,則為無環鏈表 程式如下 bool i itsloop listn...