找出有環鏈表中環的起點

2021-06-21 02:07:42 字數 956 閱讀 5410

給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。

例如:輸入:a->b->c->d->e->c[與前面的c是同乙個節點]

輸出:c

判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標、和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不難,與判斷是否有環類似,用兩個步長分別為1和2的指標遍歷鍊錶,直到兩者相遇,此時慢指標走過的長度就是環的長度。另外相遇後把其中指標重新設定為起始點,讓兩個指標以步長1再走一遍鍊錶,相遇點就是環的起始點。

證明也很簡單,證明如下:

我們注意到第一次相遇,假設快慢指標在m點第一次相遇。

慢指標走過的路程s1 = k + b

快指標走過的路程s2 = k + n * 環長 + b,  這個時候快指標可能已經走了n圈了。

由於快指標比慢指標快一倍,所以s1  = s2/2,==>  k== n*環長 - b。

現在讓乙個指標從起點開始,另乙個指標從m點同時開始,由於上面的等式,==》兩個指標最後會在環的起點處相遇。

linkedlistnode findbeginning( linkedlistnode head)  

} //error check--there is no meeting point

if (n2.next == null)

/*move n1 to head, keep n2 at meeting point*/

n1 = head;

while (n1 != n2)

//now n2 points to the start of the loop

return n2;

}

找出有環鏈表中環的起始節點

給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。例如 輸入 a b c d e c 與前面的c是同乙個節點 輸出 c 判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標 和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不...

求出有環鏈表的起點(快慢指標)

1.問題描述 給定乙個有環的鍊錶,實現乙個演算法返回環路的開頭節點 有環鏈表的定義 在鍊錶中某個節點的next元素指向在它前面出現過的節點,則表明該鍊錶存在環路 要求 不能夠使用額外的空間來進行記錄 2.題目與之前不一樣的是不能夠開闢額外的空間來進行記錄,所以我們是不能夠使用hashset來判斷哪個...

如何找出有環鏈表的入環點?

1 head到環入口的距離a過長,導致fast節點很早就進入環中了,a還沒進入環中,此時情況 fast節點走了n圈後,a才開始進入到環中,此時n 1圈 2 head節點開始就是環,或者head到環入口的距離a很短,a進入環中了,b還沒走完一圈,此時n 1圈 從上面的分析知道,當fast和slow相遇...