判斷單向鍊錶中是否有環C 實現

2021-09-19 03:48:42 字數 1163 閱讀 4707

原文:      

判斷鍊錶是否有環的經典的方法是快慢指標的方法。

快指標pf每次移動兩個節點,慢指標ps每次移動乙個節點,如果指標可以追上慢指標,那就說明其中有乙個環,反之沒有。

結論:鍊錶存在環,則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;//讓最後乙個元素的指標域指向頭結點,形成環

return head;}

int main( )

{ node* list = null;

list = init(10);

display(list);

if(i***istloop(list))

{cout<

單向鍊錶判斷是否有環

如何最有效的檢查單向鍊錶中是否包含了環。請避免使用額外的記憶體。先給出答案吧 定義兩個指標。指標a從鍊錶開始處每次向後移動一個節點。指標b從鍊錶開始處每次向後移動兩個節點。問題的關鍵是乙個單項鍊表中只可能有乙個環,並且指標一旦進入環中就無法離開。因此我們可以預期經過一段時間後,a剛好指向環的第乙個節...

判斷單向鍊錶是否有環

若單向鍊錶存在環那麼鍊錶的形態為 有環的鍊錶簡單的遍歷走不到尾 那麼我們怎麼判斷有環呢?環就像是操場的的跑到 那麼運動天賦一向不太好的 我很容易就能想到跑步時容易讓人扣圈 同理 我們可以定義兩個指標讓他們同時指向鍊錶的頭 乙個指標一次走兩步 乙個指標一次走一步 那麼如果鍊錶有環那麼他們一定會在環內的...

判斷單向鍊錶是否有環

找出環的入口點 求環的長度 求環上距離任意一點最遠的點 判斷兩個無環鏈表是否相交 判斷相交的位置 給乙個單鏈表,判斷其中是否有環的存在 如果存在環,找出環的入口點 如果存在環,求出環上節點的個數 如果存在環,求出鍊錶的長度 如果存在環,求出環上距離任意乙個節點最遠的點 對面節點 如何判斷兩個無環鏈表...