鍊錶判斷環問題

2021-06-27 02:59:48 字數 1248 閱讀 5641

問題:編寫函式判斷乙個鍊錶是否含有環,如果有環要求輸出環的起始位置,然後測試結果

此題考研時候做資料結構演算法部分題目練習的時候曾經做過,不過當時沒有要求求環的起始位置,當時題目的解法是:定義兩個指標p1,p2,p1每次移動乙個位置,而p2每次移動兩個位置,這樣如果鍊錶中存在迴圈,那麼p2一定能追上p1。如果不存在,那麼p2會到達鍊錶尾部,即檢測到空,如何找出環起始位置呢,這裡我參考了乙個博文給出的解法:

讓一指標p1從鍊錶起點處開始遍歷,指標p2從encounter處開始遍歷,且p1和p2移動步長均為1,p1和p2相遇處即為環的起始位置

參考:**如下:

//程式設計實現判斷單鏈表是否存在環,如果存在,查詢環的入口節點

#include#include#includetypedef struct nodenode,*linklist;

linklist init_link(linklist head,int n,int m);//構造乙個含環的鍊錶

bool hascircle(node* head,node **encounter);//判斷鍊錶是否含環 encounter指向相遇的節點

linklist findentry(node *head,node *encounter);//找到環的入口節點

int main()

else

printf("不存在環\n");

return 0;

}linklist init_link(linklist head,int n,int m)

cur -> next = temp;

cur = temp;

if(i == n) //構建乙個長度為8的環 最後乙個節點指向倒數第m個節點

cur ->next = p;

}} return head;

}bool hascircle(node* head,node **encounter)

}*encounter = null;

return false;

}linklist findentry(node *head, node * encounter)

return p1;

}

執行截圖

環形鍊錶判斷環問題

環形鍊錶查詢問題 給定乙個鍊錶,判斷鍊錶中是否有環。如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意 pos 不作為引數進行傳...

部分有環單向鍊錶判斷環起點問題

方法一 hash listnode detectcycle listnode head return null 方法二 快慢指標 listnode detectcycle listnode head if fast fast next return null slow head while slow...

鍊錶環問題

給定乙個鍊錶,判斷該鍊錶中是否有環?如果有的話,環的長度是多少?環的入口是哪個節點?使用快慢指標策略,兩個指標都從頭指標出發,快指標每次走兩步,慢指標每次走一步。1.判斷鍊錶是否有環?如果快慢節點相遇,那麼鍊錶有環。2.如果有環,環的長度是多少?快慢指標相遇後,固定其中乙個指標 如快指標 不動,另乙...