判斷單鏈表中是否有環(迴圈鍊錶)

2022-07-01 03:06:13 字數 1914 閱讀 4902

有環的定義:鍊錶的尾結點指向了鍊錶中的某個結點,如下圖所示

判斷是否有環,兩種方法:

方法1:使用p、q兩個指標,p總是向前走,但q每次都從頭開始走,對於每個節點看p走的步數和q是否一樣,如上圖所示:當p從6走到3時,共走了6步,此時若q從出發,則q只需要走兩步就到達3的位置,因而步數不相等,出現矛盾,存在環。

方法2:快慢指標,定義p、q兩個指標,p指標每次向前走一步,q每次向前走兩步,若在某個時刻出現 p == q,則存在環。

具體**實現:

1 #include2 #include3 #include4 #include

5 #include

6 #include7

using

namespace

std;89

#define ok 1

10#define error 0

11#define true 1

12#define false 0

1314 typedef struct

nodenode,*linklist;

1819

int initlist(linklist &l)

2627

int listlength(linklist &l)

35return

i; 36}37

38//

隨機產生n個元素的值,建立帶頭結點的單鏈表l(頭插法)

39void createlisthead(linklist &l, int

n)48

} 49

50//

隨機產生n個元素的值,建立帶頭結點的單鏈表l(尾插法)

51void createlisttail(linklist &l, int

n) 61 r->next =null;

62 p->next = l->next->next;//

成環 63}64

65//

比較步數的方法

66int hasloop1(linklist &l)

6785

}86 cur2 = cur2->next;//

如果沒有發現環,則繼續下乙個結點

87 post2++;//

cur2步數自增1 88}

89 cur1 = cur1->next;//

cur1繼續向後乙個結點

90 post1++;//

cur2步數自增1 91}

92return0;

93}9495

//利用快慢指標的方法

96int hasloop2(linklist &l)

109return0;

110}

111112

intmain()

140else

143 printf("

方法二:\n\n");

144if

(hasloop2(l))

147else

150 printf("\n"

); 151

break

;152

case'4

':153 exit(0

);

154}

155}

156return0;

157 }

執行結果:

判斷單鏈表中是否有環

define crt secure no deprecate include include include include define ok 1 define error 0 define true 1 define false 0 typedef int status 函式結果狀態 如ok。t...

判斷單鏈表中是否有環

單鏈表中的迴圈鍊錶尾結點不一定指向頭結點,也可以指向任意中間結點。此時若想判斷單鏈表中是否有環,就不能只是簡單的根據尾結點的next是不是頭結點來判斷,在此我提供三種方法 方法一 建立兩個指標p和q,其中p用來遍歷指標,每次只走一步,並記錄從根節點出發所走的步數,而q則是每次從根節點出發,到達p此時...

判斷單鏈表是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...