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

2021-08-19 13:14:13 字數 723 閱讀 3053

首先,我們採用快慢指標來判斷鍊錶是否有環,假設有環,快慢指標定會在某一刻在一點相聚。

下面要解決的問題是如何找到這個環的入口:

a為環入口點到頭結點的路程,x為相遇點到環入口點的路程。我們假設slow指標走過的路程為s,那麼fast指標走過的路程則為2s,假設環長為c。且有

2s = s + nc

s = a + x

有上述式子,我們可以得到

a + x = nc

a = nc – x

a = (n – 1)c + c -x

如果在頭結點位置和相遇點位置分別再派出兩名跑步選手,並且他們都每次只跑一步,好像會在環的入口點相遇啊!

public listnode detectcycle(listnode head) 

slow = slow.next;

fast = fast.next.next;

if(fast==slow)

break;

}slow = head;//slow back to start point

while(slow != fast)

return slow; //when slow == fast, it is where cycle begins

}

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

public class linkedhascycle return false 求環長度 當鍊表有環後兩指標繼續向前迴圈,當再次相遇後即環的長度 環長 每次速度差 前進次數 前進次數 param node return public static int cyclelength node node...

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

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

判斷鍊錶是否有環

1.如何判斷是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。2.如何計算環的長度?第一次相遇 超一圈 時開始計數,第二次相遇時停止計數。3.如何判斷環的入口點 碰撞點p到連線點的距離 頭指標到連線點的距離,因此,分別從碰撞點 頭指標開始走,相遇的...