C 筆試題之判斷鍊錶中是否有環,並計算環的長度

2021-08-20 02:31:46 字數 1352 閱讀 3017

判斷鍊錶中是否有環最經典的方法就是快慢指標,同時也是面試官大多想要得到的答案。

快指標pf(f就是fast的縮寫)每次移動2個節點,慢指標ps(s為slow的縮寫)每次移動1個節點,如果快指標能夠追上慢指標,那就說明其中有乙個環,否則不存在環。

這個方法的時間複雜度為o(n),空間複雜度為o(1),實際使用兩個指標。

原理

鍊錶存在環,則fast和slow兩指標必然會在slow對鍊錶完成一次遍歷之前相遇,證明如下:

slow首次在a點進入環路時,fast一定在環中的b點某處。設此時slow距煉表頭head長為x,b點距a點長度為y,環周長為s。因為fast和slow的步差為1,每次追上1個單位長度,所以slow前行距離為y的時候,恰好會被fast在m點追上。因為yfast和slow相遇了,可以肯定的是這兩個指標肯定是在環上相遇的。此時,還是繼續一快一慢,根據上面得到的規律,經過環長s,這兩個指標第二次相遇。這樣,我們可以得到環中一共有多少個節點,即為環的長度。

實現

#include using namespace std;

struct node;

void display(node *head)// 列印鍊錶

else

}cout << endl;

}bool i***istloop(node* head)

return !(fast == null || fast->next == null);

}int getlooplength(node* head)

slow = slow->next;

fast = fast->next->next;

int length = 1; //環長度

while ( fast != slow )//再次相遇

return length;

}node* init(int num) // 建立環形鍊錶

cur->next = head;//讓最後乙個元素的指標域指向頭結點,形成環

判斷鍊錶中是否有環

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

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

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

判斷鍊錶是否有環

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