這裡 有乙個 比較 簡單 的 解法。 設定 兩個 指標 p1、 p2。 每次 迴圈 p1 向前 走 一步, p2 向前 走兩步。 直到 p2 碰到 null 指標 或者 兩個 指標 相等 時 結束 迴圈。 如果 兩個 指標 相等, 則 說明 存在 環。
bool whetherlistloop(st_datanode * head)
bool rst = false; /* 預設不是打環的 */
st_datanode * pos1 = null, * pos2 = null;
pos1 = pos2 = head;
if(null == pos1->next)
while(null != pos1 && null != pos1->next)
} if(pos1 == pos2)
out:
return rst;
}void testwhetherlopp(void) else
tail = ghead;
while(tail->next != null)
tail->next = ghead;
rst = whetherlistloop(ghead);
if(rst) else
tail->next = null;
dumplist(ghead);
return;
}
gcc listmain.c list.c -o a.exe -ddebug
*****= testwhetherlopp **********=
not loop
list loop
*****==== dump list 0x76d090 **********=
0 4 6 19 22 29 32 47 53 116
***********************************
單向鍊錶是否有環問題 C
問題描述 在單向鍊錶中,每個結點都包含乙個指向下乙個結點的指標,最後乙個結點的這個指標被設定為空。但如果把最後乙個結點的指標指向鍊錶中存在的某個結點,就會形成乙個環,在順序遍歷鍊錶的時候,程式就會陷入死迴圈。如何檢測乙個鍊錶中是否有環,如果檢測到環,如何確定環的入口點 即求出環長,環前面的鏈長 一種...
判斷鍊錶是否有環,入口節點以及環的大小(C )
這篇部落格對上述問題有詳細的解釋 判斷鍊錶中是否有環 有關單鏈表中環的問題 這裡只做c 的乙個 實現,主要包含構建環形鍊錶,判斷是否有環以及環的大小。include include using namespace std struct node node creatcircularlist newn...
C語言 C 之鍊錶實現約瑟夫環
本人計算機剛入門,老師看我們學習程式設計太慢就布置了幾個經典程式設計任務,限期完成,其中包括約瑟夫環問題。多方複習反覆琢磨終於親自work out,老師說需要free一下記憶體麻煩看到的朋友指點指點,因為我第一步的資料後面還需要用到,不知道怎麼free。include include define ...