求有環單鏈表中的環長、環起點、鏈表長


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中求出了連接點的位置,就可以求出頭結點到連接點的長度。兩者相加就是鏈表的長度。

發佈了69 篇原創文章 · 獲贊 56 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章