鍊錶中是否有環 返回鍊錶開始入環的第乙個節點

2021-09-12 10:33:24 字數 1700 閱讀 7627

(1)給定乙個鍊錶,判斷鍊錶中是否有環:

我們可以用快慢指標的方法解決這個問題。fast指標一次走2步,slow指標一次走1步,則當兩個指標走一次時兩個指標相差1步,走兩次時相差2步,以此類推當走n次時fast指標與slow指標相差n步,每多走一次兩個指標之間相差步數加1。

若slow走n步入環,則此時fast以入環且比slow快n步,因為在環中,故我們可以看作fast指標在追趕slow指標,設環長為l,則fast與slow相差l-n步。已知每多走一次兩個指標之間相差步數加1,則當fast追slow時,每多走一次兩個指標之間相差步數減1。因此fast與slow相差步數從l-n一直遞減至0,此時兩指標相遇。

因此當兩指標相遇時我們可以說鍊錶有環。

(若fast走其他大於2的步數,則當fast追slow時步數差減少有可能會錯過0步,直接超過slow,當環數處於乙個特殊值時兩個指標可能永遠不會相遇,每次將要相遇時fast將會直接超過slow)

(直線為入環前的鍊錶,環可以為任意非0數的結點,此處僅以5做表示)

/**

* definition for singly-linked list.

* struct listnode ;

*/bool

hascycle

(struct listnode *head)

}return

0;

}

(2)給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回null:演算法:

與前一題相同,先找到fast與slow指標相遇的結點,然後維護兩個指標fast指標以一次1步的行動方式從相遇結點開始行動,slow指標以相同行動方式從鍊錶的第乙個結點開始行動,當兩指標相遇時相遇結點便是入環的第乙個結點。

演算法分析:

設meet結點與入環第乙個結點相差f,當兩指標在meet結點相遇時,slow走過的距離為n+f,fast走過的距離為n+f+xl(x為未知次,因為若環較小時當slow入環時fast已經遍歷環若干次了)fast走過的距離為slow的二倍

當fast從meet結點開始行動時,剩下的距離就為l-f了,而slow從鍊錶的第乙個結點開始走時剩下的距離為n,因此當兩指標相遇時相遇結點變為入環的第乙個結點。(因為x為遍歷環的次數,無論遍歷多少次環都會回到相同的結點,所以x可以忽略)

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode *detectcycle

(struct listnode *head)

}if (fast ==

null || slow ==

null || fast->next ==

null)

fast = head;

while (fast != slow)

return fast;

}

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

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

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

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

判斷鍊錶中是否有環

單向鍊錶中有環的話,如果我們對此鍊錶進行遍歷,則將無窮盡。因此有必要判斷乙個單向鍊錶是否有環。假如乙個單向鍊錶中存在環,如下圖 乙個小矩形代表鍊錶中的乙個節點 虛線箭頭代表中間有無數節點。先說演算法,然後再來證明演算法的正確性。鍊錶的頭指標為h if null h null h next 頭指標為空...