1.判斷單鏈表是否有環
使用兩個slow, fast指針從頭開始掃描鏈表。指針slow 每次走1步,指針fast每次走2步。如果存在環,則指針slow、fast會相遇;如果不存在環,指針fast遇到NULL退出。
就是所謂的追擊相遇問題:
2.求有環單鏈表的環長
在環上相遇後,記錄第一次相遇點爲Pos,之後指針slow繼續每次走1步,fast每次走2步。在下次相遇的時候fast比slow正好又多走了一圈,也就是多走的距離等於環長。
設從第一次相遇到第二次相遇,設slow走了len步,則fast走了2*len步,相遇時多走了一圈:
環長=2*len-len。
3.求有環單鏈表的環連接點位置
第一次碰撞點Pos到連接點Join的距離=頭指針到連接點Join的距離,因此,分別從第一次碰撞點Pos、頭指針head開始走,相遇的那個點就是連接點。
在環上相遇後,記錄第一次相遇點爲Pos,連接點爲Join,假設頭結點到連接點的長度爲LenA,連接點到第一次相遇點的長度爲x,環長爲R。
第一次相遇時,slow走的長度 S = LenA + x;
第一次相遇時,fast走的長度 2S = LenA + n*R + x;
所以可以知道,LenA + x = n*R; LenA = n*R -x;
4.求有環單鏈表的鏈表長
上述2中求出了環的長度;3中求出了連接點的位置,就可以求出頭結點到連接點的長度。兩者相加就是鏈表的長度。