帶環的鏈表

原文地址  作者July

單鏈表的問題在面試考試等等等等中頻頻上鏡,大有趕上鳳姐超越芙蓉之勢。假若有一個蛋疼的程序猿把單鏈表的末尾結點的next指針指向了單鏈表中一個隨機的結點上,那麼我們經常寫的一個循環while(p)或者while(p->next)就可以父傳子子傳孫子子孫孫無窮盡了。

   話說怎麼判斷單鏈表是否帶環了呢?大部分人都知道了:讓快指針追慢指針,追上了就有環,快指針走到頭了,就無環。

   那麼又如何判斷那個dt的程序猿把尾結點的next指針指向何處或者說環的入口在哪呢?也許下面的推導只是小學初中級的數學知識,但是大多數人(包括我在內)都沒有想到過這麼玄而又玄的問題可以用這麼簡單的數學理論來解答:

   假設單鏈表的總長度爲L,頭結點到環入口的距離爲a,環入口到快慢指針相遇的結點距離爲x,環的長度爲r,慢指針總共走了s步,則快指針走了2s步。另外,快指針要追上慢指針的話快指針至少要在環裏面轉了一圈多(假設轉了n圈加x的距離),得到以下關係:

   s = a + x;

   2s = a + nr + x;

   =>a + x = nr;

   =>a = nr - x;

   由上式可知:若在頭結點和相遇結點分別設一指針,同步(單步)前進,則最後一定相遇在環入口結點,搞掂!

附圖:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章