問題描述:在單向鍊錶中,每個結點都包含乙個指向下乙個結點的指標,最後乙個結點的這個指標被設定為空。但如果把最後乙個結點的指標指向鍊錶中存在的某個結點,就會形成乙個環,在順序遍歷鍊錶的時候,程式就會陷入死迴圈。如何檢測乙個鍊錶中是否有環,如果檢測到環,如何確定環的入口點(即求出環長,環前面的鏈長)。
一種比較耗空間的做法是,從頭開始遍歷鍊錶,把每次訪問到的結點(或其位址)存入乙個集合(hashset)或字典(dictionary),如果發現某個結點已經被訪問過了,就表示這個鍊錶存在環,並且這個結點就是環的入口點。這需要o(n)空間和o(n)時間,其中n是鍊錶中結點的數目。
如果要求只是用o(1)空間、o(n)時間,應該怎麼處理呢?
int is_link_list_cicled(node* head)return 0;
}
證明:
證明步長法的正確性(追擊問題,如果有環則肯定可以相遇):
如果鍊錶有環,不妨假設其環長度為m(>=2)。
p指標首次到達交點(n0)時,q指標已經進入環。
設p=0;q=q-p;
再進過i(i>=0)步後,p=(p+i)%m;q=(q+2*i)%m;
則必存在乙個i使得(p+i)%m = (q+2*i)%m。(p,q 都為常數)。
問題描述參考:
gocalf 的blog
單向鍊錶判斷是否有環
如何最有效的檢查單向鍊錶中是否包含了環。請避免使用額外的記憶體。先給出答案吧 定義兩個指標。指標a從鍊錶開始處每次向後移動一個節點。指標b從鍊錶開始處每次向後移動兩個節點。問題的關鍵是乙個單項鍊表中只可能有乙個環,並且指標一旦進入環中就無法離開。因此我們可以預期經過一段時間後,a剛好指向環的第乙個節...
判斷單向鍊錶是否有環
若單向鍊錶存在環那麼鍊錶的形態為 有環的鍊錶簡單的遍歷走不到尾 那麼我們怎麼判斷有環呢?環就像是操場的的跑到 那麼運動天賦一向不太好的 我很容易就能想到跑步時容易讓人扣圈 同理 我們可以定義兩個指標讓他們同時指向鍊錶的頭 乙個指標一次走兩步 乙個指標一次走一步 那麼如果鍊錶有環那麼他們一定會在環內的...
判斷單向鍊錶是否有環
找出環的入口點 求環的長度 求環上距離任意一點最遠的點 判斷兩個無環鏈表是否相交 判斷相交的位置 給乙個單鏈表,判斷其中是否有環的存在 如果存在環,找出環的入口點 如果存在環,求出環上節點的個數 如果存在環,求出鍊錶的長度 如果存在環,求出環上距離任意乙個節點最遠的點 對面節點 如何判斷兩個無環鏈表...