鍊錶是否有環?環入口點?

2021-05-22 20:35:55 字數 638 閱讀 6626

1、如何判斷乙個鍊錶是不是這類鍊錶?  2、如果鍊錶為存在環,如果找到環的入口點? 解答:一、判斷鍊錶是否存在環,辦法為:設定兩個指標(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。(當然,fast先行頭到尾部為null,則為無環鏈表)程式如下:  

二、找到環的入口點 當fast若與slow相遇時,slow肯定沒有走遍歷完鍊錶,而fast已經在環內迴圈了n圈(1<=n)。

假設slow走了s步,則fast走了2s步(fast步數還等於s 加上在環上多轉的n圈),設環長為r,

則:  2s = s + nr    s= nr

設整個鍊錶長l,入口環與相遇點距離為x,起點到環入口點的距離為a。   

a + x = s = nr   

a + x = (n – 1)r +r = (n-1)r + l - a   

a = (n-1)r + (l – a – x)

(l – a – x)為相遇點到環入口點的距離,由此可知,從煉表頭到環入口點等於(n-1)迴圈內環+相遇點到環入口點,於是我們從煉表頭、與相遇點分別設乙個指標,每次各走一步,兩個指標必定相遇,且相遇第一點為環入口點。

程式描述如下:

鍊錶 是否帶環,環的長度以及入口點

求環的入口點 listnode meetnode listnode phead listnode fast phead listnode slow phead while fast next next null if fast next next null slow phead while fast...

鍊錶是否帶環?環長 入口?時間複雜度?

是否帶環 基本思路 定義兩個指標從頭結點開始,乙個一次向後走一步,一次走兩步,迴圈,若能夠走到null,則不帶環,若走到兩個指標相等,則帶環。如下 pairhascircle pnode phead 判斷是否帶環,帶環的話環的長度,入口。return make pair false,pnode nu...

判斷單向鍊錶是否有環,環起點,環長,鍊錶長

一 判斷單向鍊錶是否有環 方法1 設定乙個hashset,順序讀取鍊錶中的節點,判斷hashset中是否有該節點的唯一標識 id 如果在hashset中,說明有環 如果不在hashset中,將節點的id存入hashset。這種方法時間複雜度已經最優,但是因為額外申請了hashset,所以空間複雜度不...