判斷乙個單向鍊錶上是否有環的方法有哪些呢?
方法1:用乙個指標陣列a,儲存已訪問過的節點。用乙個指標p,每次在鍊錶上移動一步,然後與指標陣列a比較,若陣列中沒有指標與p相同,說明第一次訪問p,將p放入陣列中;若有指標與p相同,則存在環路,且第一次相同的節點就是環的入口點。
鍊錶長度為n,則需要空間o(n),且每次要與指標陣列比較,時間複雜度為 o(n^2)。
方法2:在節點上記錄該節點是否被訪問過,如果在指標移動過程中遇到已訪問過的節點,說明存在環路。同樣地,第一次相同的節點就是環的入口點。
方法2:快慢指標
設頭節點到環路起始點距離為a。
首先,用指標p和q,從頭節點開始,每次各走2步和1步,假設x步之後二者相遇,可以證明,此時q還沒有走完整個鍊錶。設環路起始點到相遇點距離為b,相遇點往前到環路起始點距離為c, 則有等式:
p: 2x = a+b+n(b+c) n為p繞環路的圈數
q: x= a+b
則可以推出 x=n(b+c) = a+b
a = (n-1)(b+c)+c
這樣,可以讓p從頭結點開始,q從相遇點開始,每次各走一步,則經過a步之後,二者再次相遇。a即為頭節點到環路起始點的距離,這一次的相遇點即為環路起始點。
struct node* hascircle( node* head )
if( p1!=p2 ) return null;
p1 = head;
while( p1!=p2 )
return p1;
}
單向鍊錶判斷是否有環
如何最有效的檢查單向鍊錶中是否包含了環。請避免使用額外的記憶體。先給出答案吧 定義兩個指標。指標a從鍊錶開始處每次向後移動一個節點。指標b從鍊錶開始處每次向後移動兩個節點。問題的關鍵是乙個單項鍊表中只可能有乙個環,並且指標一旦進入環中就無法離開。因此我們可以預期經過一段時間後,a剛好指向環的第乙個節...
判斷單向鍊錶是否有環
若單向鍊錶存在環那麼鍊錶的形態為 有環的鍊錶簡單的遍歷走不到尾 那麼我們怎麼判斷有環呢?環就像是操場的的跑到 那麼運動天賦一向不太好的 我很容易就能想到跑步時容易讓人扣圈 同理 我們可以定義兩個指標讓他們同時指向鍊錶的頭 乙個指標一次走兩步 乙個指標一次走一步 那麼如果鍊錶有環那麼他們一定會在環內的...
判斷單向鍊錶是否有環
找出環的入口點 求環的長度 求環上距離任意一點最遠的點 判斷兩個無環鏈表是否相交 判斷相交的位置 給乙個單鏈表,判斷其中是否有環的存在 如果存在環,找出環的入口點 如果存在環,求出環上節點的個數 如果存在環,求出鍊錶的長度 如果存在環,求出環上距離任意乙個節點最遠的點 對面節點 如何判斷兩個無環鏈表...