1.單鏈表是否有環
使用快慢指標,都從head出發,慢指標一次一步,快指標一次兩步,如果兩個指標相遇,說明鍊錶有環,否則,快指標為null或其next為null,到達末尾節點
functionhascircle(head)
}return fast != null && fast.next != null
;}
2.單鏈錶環的入口點
使用快慢指標,先判斷是否有環,若有環,則慢指標從head出發,快指標與其同樣的速度執行,直到相遇的一點,即為環入口點。
functiongetcircleentry(head)
}if(fast == null || fast.next == null
) slow =head;
while(slow !=fast)
return
fast;
}
3. 單鏈錶環的大小
指標繞環一圈,記錄其走過的步數,即為環大小
functiongetcirclelen(head)
}return
len;
}
4. 解開乙個環
找到環入口點的後面乙個節點,即環的末尾節點,將其next設定為null,斷鏈,解環
functionbreakcircle(head)
p.next = null
; }
}
判斷單鏈表是否存在環,尋找單鏈錶環的入口
判斷單鏈表是否存在環,如果存在環,找出環的入口 有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如何找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fa...
判斷單鏈表是否有環,若有環輸出環的入口節點
思路 1 快慢引用 fast 一次跑兩個,slow一次跑乙個兩者相遇有環,但相遇點不一定是入口點,如何證明是不是入口點?快路徑長度 2慢路徑長度 2 實現 public class link return null public void addhead t value else public vo...
判斷單鏈表是否有環及找環的入口
使用快慢指標,找到相遇節點 然後乙個指標指向頭節點,乙個指向相遇節點,一步步走直到兩個指標指向同乙個節點 即為環的入口點 include using namespace std typedef struct nodenode,linklist bool i istsloop linklist l r...