1、判斷鍊錶是否有環
2、得到環的長度
3、得到環的入口節點
設定兩個指標,讓乙個前進速度快,乙個前進速度慢,當兩者相遇就說明鍊錶存在環
環的長度由第一次兩指標相遇到第二次兩指標相遇所迴圈的次數得出
環的入口節點怎麼得出需要證明:假設速度快的節點fast每次走兩步用,慢的節點slow每次走一步;
它們倆第一次相遇時fast走了2s步,slow走了s步,入口節點到頭節點的距離是a,環長r,a+r為l;
第一次相遇時2s=s+nr;即s=nr,繼而推出s=(n-1)r+(l-a);並且由於是第一次相遇,可以推出
slow並沒有走完一次環(因為在slow到達環時fast就已經在環內了,fast能追上slow),所以設slow
在環內走了x步,則a+x=(n-1)r+(l-a);a=(n-1)r+(l-a-x);即a的長度等於(n-1)個環的
長度加上第一次相遇時slow沒走完的環的剩餘長度。所以當兩個指標乙個從鍊錶的頭開始走,乙個從slow開始走,兩者相遇的時候該節點就是環的入口節點。
#include using namespace std;
typedef struct node
list;
bool isloop(list *a);
int lplength(list *a);
list *loopentrance(list *a);
int main(int argc, char *ar**)
bool isloop(list *a) //判斷是否存在環
return false;
}int lplength(list *a) //得到環的長度
return length;
}list *loopentrance(list *a) //得到環的入口節點位址
slow = a;
while (slow != fast)
return slow;
}
判斷乙個鍊錶是否有環
1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...
判斷乙個鍊錶是否有環
給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到null退出。2...
判斷乙個鍊錶是否有環
乙個鍊錶如果是這樣部分有環的應該怎樣判斷 現在可以找出的是乙個鍊錶是否有環,而且可以找出環開始的那個點。假設有兩個學生a和b在跑道上跑步,兩人從相同起點出發,假設a的速度為2m s,b的速度為1m s,結果會發生什麼?答案很簡單,a繞了跑道一圈之後會追上b!class node public cla...