C中怎麼判斷連結串列中是否有環?

2025-01-07 18:50:13 字數 2182 閱讀 1540

1樓:重慶新華電腦學校

用兩個指標來遍歷這個單向連結串列,第乙個指標p1,每次走一步;

第二個指標p2,每次走兩步;

當p2 指標追上p1的時候,就表明連結串列當中有環路了。

a.判斷連結串列是否有環。

設定兩個指標p1和p2,初始值均指向連結串列頭,p1每次向前走一步,而p2每次向前走兩步。

如果連結串列有環,則p2先進入環裡,而p1後進入環裡,兩個指標在環中必定相遇。

如果p1與p2沒有相遇,p2遍歷到連結串列的尾部,則表示連結串列沒有環。

b.連結串列有環,確定環的入口點。

設定p1指標指向連結串列頭,p2指向相遇點,每次兩個指標都是隻走一步,兩個指標必定相遇,則相遇第一點為環入口點。

c.計算環長。

在環的入口點設定乙個指標和乙個計數器,讓這個指標在環裡面走,每走一步,計數器就加1,當這個指標回到環的入口點的時候,計數器的值就是環長。

例如:int testlinkring(link *head)

link *t1=head,*t2=head;while( t1->next &&t2->next)

t1 = t1->next;if (null ==t2 = t2->next->next))return 0; /無環 if (t1 ==t2)return 1;

return 0;

2樓:yx陳子昂

c語言的連結串列依賴於每個節點中的連結串列指標的正確性上,這個是連結串列實現本身需要保證的。

可以用不同演算法的遍歷來比較結果,判斷是否有環的現象:

方法2:設定兩個速度不同的指標同時從連結串列的第乙個節點開始遍歷連結串列,乙個快指標 fp 每次移動兩個節點,乙個慢指標sp每次移動乙個節點,若兩個指標能相遇,則存在環。(注:

這裡的慢指標中儲存的即為快指標訪問過的節點)

方法3:將每個訪問過的節點的 next 指標指向前乙個節點,這樣當指標訪問到最後乙個節點時,若該節點為頭結點,則有環。但是這種方法破壞了連結串列的結構,不推薦使用。

如何判斷乙個單連結串列是否存在環?

3樓:謝謝笑笑妹x浄

給定乙個單連結串列,試判斷該單連結串列有無存在環。

解答:演算法的思想是設定兩個指標p, q,其中p每次向前移動一步,q每次向前移動兩步。那麼如果單連結串列存在環,則p和q相遇;否則q將首先遇到null。

假定單連結串列的長度為n,並且該單連結串列是環狀的,那麼第i次迭代時,p指向元素i mod n,q指向2i mod n。因此當i≡2i(mod n)時,p與q相遇。而i≡2i(mod n) => (2i - i) mod n = 0 => i mod n = 0 => 當i=n時,p與q相遇。

這裡乙個簡單的理解是,p和q同時在操場跑步,其中q的速度是p的兩倍,當他們兩個同時出發時,p跑一圈到達起點,而q此時也剛好跑完兩圈到達起點。

那麼當p與q起點不同呢?假定第i次迭代時p指向元素i mod n,q指向k+2i mod n,其中0

如何判斷連結串列是否有環

4樓:網友

使用追趕的方法,設定兩個指標show,fast,從頭節點開始,每次分別前進1步,2步,如存在環則兩者必然會相遇,如不存在環,則fast遇到null退出,並且碰撞點到頭節點的距離為環中節點數n.

5樓:帳號已登出

第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向連結串列的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。

1. 如果快指標指向空,則連結串列無環。

2. 若快指標和慢指標再次指向乙個相同節點,則證明連結串列有環。

入環節點:記快慢指標首次在節點i處相遇,即二者均指向節點i。令慢指標指向連結串列的頭節點h,之後,慢指標和快指標同時移動,每次後移乙個指標,第乙個相遇的節點就是環的起點。

環的長度,兩種方法:

法1. 求入環節點時,在慢指標指向連結串列頭節點、快指標指向節點i時,設定整型變數length = 0, 之後直至快慢指標相遇,二者每同時移動一次,lenght增加1。相遇後,length + 1 即環的長度。

法2. 在快慢指標指向相同的節點i時,設定 length = 0, 快指標仍每次後移兩個節點,慢指標每次後移乙個節點,快慢指標同時移動後, length增加1。 快慢指標再次相遇時,length即為環的長度。

對於思路可以進一步參閱。

第二種方法: brent's algorithm

C在連結串列末尾增加結點,c 怎麼在連結串列中插入結點

你的 p head 也就是說你的結點p是指向你的連結串列的頭結點的,但是頭結點的作用只是一個標誌結點,它之中沒有儲存資料的。也就是這樣的 p data null p next x x為連結串列的第一個儲存資料的結點你把while迴圈改一下試試 while p next 這樣就可以了!實現在末尾增加結...

如何在c和c 中判斷變數是否為空

風若遠去何人留 c c 中,任何一個變數在定義後即擁有自身的記憶體空間,而記憶體空間中是一定有值的,所以不存在絕對意義上的空值。一般來說,判斷空值都是判斷定以後,是否被賦值過,所以只需要判斷變數值是否還是初始值即可。區分變數型別,有一些常用的初始化情況 1 指標型別。指標型別一般被初始化為null,...

C 中如何判斷物件是否屬於某個類

c 語言判斷一個物件有兩種機制 在執行時判斷,使用if else int i if typeid i typeid int cout i is int endl else cout i is not int endl 在編譯時判斷,使用過載或者特化 template class t void fun...