假設存在環, 環前共l個節點, 環中共c個節點.
設乙個慢指標起始位置為a, 速度為1, 快指標起始位置為b, 速度為2.
t時間後, 二者相遇, 可列方程:
(a+t-l)mod c == (b+2*t-l)mod c
即t=a-b(mod c), 該模線性方程必定有解.
所以無論a, b的起始位置如何, 二者總是會相遇的.
struct node
int data;
node* next;
void check_chain_circle(node* temp)
node* head1=temp;
node* head2=temp;
while(head1->next!=head2->next->next)
head1=head1->next;
head2=head2->next->next;
if(head1==null||head2==null)
printf("no circle!/n");
return;
printf("yes, the chain has circle!/n");
return;
2011-04-27 16:04:29
如何判斷鍊錶有環?
題目描述 如果有乙個單向鍊錶,鍊錶當中有可能出現 環 就像下圖這樣,如何判斷這個鍊錶是有環鏈表?方案一 暴力法 從頭節點,依次遍歷單鏈表的每乙個節點,每到乙個新的節點就頭節點重新遍歷之前的所有的節點,對比此時的節點,如果相同,證明該節點遍歷過兩次,以此說明鍊錶是有環的 偽 node p head.n...
如何判斷鍊錶有環?
參考 程式設計師小灰 參考2 漫畫演算法 如何判斷鍊錶有環?package chapter5.part2 public class linkedlistcycletest else private static boolean iscycle node head return false priva...
如何判斷鍊錶有環
題目描述 有乙個單向鍊錶,鍊錶中有可能出現 環 如下圖,那麼,如何用程式來判斷該鍊錶是否為有環鏈表呢?方法一 從頭節點開始遍歷每乙個節點,每遍歷乙個新節點就從頭檢查到新節點之前的所有節點,如果和該新節點的值有重複,則證明該節點被遍歷過兩次,鍊錶有環 如果不存在與新節點相同值的節點,就繼續遍歷下乙個新...