求鍊錶是否有環,求煉錶環的長度和入環點

2021-10-04 18:27:46 字數 1330 閱讀 2595

public class linkedhascycle 

}return false;

}/**

* 求環長度:

* 當鍊表有環後兩指標繼續向前迴圈,當再次相遇後即環的長度 環長 = 每次速度差 * 前進次數 = 前進次數

** @param node

* @return

*/public static int cyclelength(node node)

hascycle = true;

}if (hascycle)

}return cyclelength;

}/**

* 求入環點:

* 煉表頭節點到入環點的距離,等於從首次相遇點環繞n-1圈後再回到入環點的距離。

* 保持節點在首次相遇點,另乙個指標回到頭節點位置,兩個指標都每次向前走一步,那麼最終相遇的節點,就入環節點

* @param node

* @return

*/public static node getinsertcyclenode(node node)

}//保持節點在首次相遇點,另乙個指標回到頭節點位置,兩個指標都每次向前走一步,那麼最終相遇的節點,就入環節點

while (original != null && p3 != null)

}return null;

}private static class node

@override

public string tostring()

}public static void main(string args)

}

針對入環點方法 getinsertcyclenode 說明:

假設從煉表頭節點到入環點的距離是d,從入環點到首次相遇節點距離是s1,從首次相遇到入環點的距離是s2

那麼當兩次首次相遇時:

指標p1,一次只走一步,所走的距離是d+s1

指標p2,一次走兩步,多走了n(n>=1)整圈,所走的距離是d+s1+n(s1+s2)

由於p2的速度是p1的2倍,所以所走的距離也是p1的兩倍,因此:

2(d + s1) = d + s1 + n(s1 + s2)  -->  d =(n -1)(s1 + s2) +s2;

也就是說,從煉表頭節點到入環點的距離,等於從首次相遇點繞環 n-1圈再回到入環點的距離

所以只要把其中乙個指標放回到頭節點位置,另乙個指標保持在首次相遇點,兩個指標都向前走一步,那麼他們最終相遇的節點就是入環點。

判斷鍊錶是否有環,若有,計算環長度

原文 思想 快慢指標法。快指標的步長是2,慢指標的步長是1,若相遇,則必有環。int hascycle listnode head fast head slow head if null fast null fast next return0 環長計算思想 快慢指標從第一次重合到第二次重合,慢指標的...

判斷鍊錶是否有環,求環的入口點及環長

今天的內容主要包括三部分,rt。1。判斷鍊錶是否帶環 判斷鍊錶是否帶環,我們可以採用在頭結點設兩個指標,乙個叫fast,乙個叫slow,fast一下走兩步,而slow一下走一步。如果鍊錶中存在環的話,那麼fast和slow必定會在環中相遇。若煉表中沒有環的話,那麼fast必定現於slow指標先到達鍊...

如何判斷鍊錶是否有環 鍊錶是否有環的判斷

對於鍊錶是否存在環,有三個問題需要考慮 1.是否有環 2.入環節點 3.環的長度 第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向鍊錶的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。1.如果快指標指向空,則鍊錶無環 2.若快指標和慢指標再次指向乙個...