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.若快指標和慢指標再次指向乙個...