判斷乙個鍊錶是否有環

2021-10-01 22:01:32 字數 912 閱讀 5796

下圖是乙個有環鏈表

設定兩個鍊錶指標fast, slow,初始值都指向煉表頭結點,然後兩個指標都往後走,不同的是slow每次前進一步,即前進乙個節點。fast每次前進兩步,如果存在環,兩個指標必定相遇。 

因為只有存在環的情況,我們才可能出現走的快的指標能再次遇到慢的指標。 

並且還有一點就是,若該鍊錶存在環,則在慢指標還沒走完一整個環的路程之前,兩指標已經相遇。 

為什麼?因為從慢指標進入環入口開始計時,慢指標走完一圈的時間,此時快指標已經走了兩圈。所以在慢指標走完一圈之前,兩指標一定會相遇。

把兩指標相遇點記為o。則慢指標已走的環路程記為x,環剩下的路程記為y

設slow在相遇前走了s步,則fast走了2s步,設環長為r,有2s=s+nr,即s=nr。

由上圖可知a+x=s, x+y=r,而我們的目標是找到a的位置。a+x=s=nr=(n-1)r+r=(n-1)r+y+x,則a=(n-1)r+y. 這個公式告訴我們,從煉表頭和相遇點o分別設乙個指標,每次各走一步,這兩個指標必定相遇,且相遇的第乙個點為環入口點。

struct link  

; // 插入節點

void insertnode(link *&head, int data)

// 判斷鍊錶是否存在環

link* hascycle(link* head)

return null;

} // 確定環的入口點,pos表示fast與slow相遇的位置

link* findcycleentry(link* head, link* pos)

return head;

}

判斷乙個鍊錶是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...

判斷乙個鍊錶是否有環

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到null退出。2...

判斷乙個鍊錶是否有環

乙個鍊錶如果是這樣部分有環的應該怎樣判斷 現在可以找出的是乙個鍊錶是否有環,而且可以找出環開始的那個點。假設有兩個學生a和b在跑道上跑步,兩人從相同起點出發,假設a的速度為2m s,b的速度為1m s,結果會發生什麼?答案很簡單,a繞了跑道一圈之後會追上b!class node public cla...