問題:編寫函式判斷乙個鍊錶是否含有環,如果有環要求輸出環的起始位置,然後測試結果
此題考研時候做資料結構演算法部分題目練習的時候曾經做過,不過當時沒有要求求環的起始位置,當時題目的解法是:定義兩個指標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.如果有環,環的長度是多少?快慢指標相遇後,固定其中乙個指標 如快指標 不動,另乙...