1. 程式人生 > >有環單鏈表總結 [轉]

有環單鏈表總結 [轉]

Reference

[1] http://www.cnblogs.com/xudong-bupt/p/3667729.html

 

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*x;

    所以可以知道,LenA + x =  n*R;  LenA = n*R -x;

4.求有環單鏈表的連結串列長

   上述2中求出了環的長度;3中求出了連線點的位置,就可以求出頭結點到連線點的長度。兩者相加就是連結串列的長度。