求有環單鏈表中的環長 環起點 鍊錶長

2021-08-11 06:07:30 字數 2865 閱讀 2416

1.判斷單鏈表是否有環

使用兩個slow, fast指標從頭開始掃瞄鍊錶。指標slow 每次走1步,指標fast每次走2步。如果存在環,則指標slow、fast會相遇;如果不存在環,指標fast遇到null退出。

就是所謂的追擊相遇問題:

2.求有環單鏈表的環長

在環上相遇後,記錄第一次相遇點為pos,之後指標slow繼續每次走1步,fast每次走2步。在下次相遇的時候fast比slow正好又多走了一圈,也就是多走的距離等於環長。

設從第一次相遇到第二次相遇,設slow走了len步,則fast走了2*len步,相遇時多走了一圈:

環長=2*len-len。

3.求有環單鏈表的環連線點位置

第一次碰撞點pos到連線點join的距離=頭指標到連線點join的距離,因此,分別從第一次碰撞點pos、頭指標head開始走,相遇的那個點就是連線點。

在環上相遇後,記錄第一次相遇點為pos,連線點為join,假設頭結點到連線點的長度為lena,連線點到第一次相遇點的長度為x,環長為r

第一次相遇時,slow走的長度 s =lena+x;

第一次相遇時,fast走的長度 2s =lena+ n*r+x;

所以可以知道,lena+x =n*r;lena = n*r -x;

4.求有環單鏈表的鍊錶長

上述2中求出了環的長度;3中求出了連線點的位置,就可以求出頭結點到連線點的長度。兩者相加就是鍊錶的長度。

程式設計實現:

下面是**中的例子:

具體**如下:

1 #include 2 #include 3 typedef struct

nodelinknode,*linklist;78

///建立鍊錶(鍊錶長度,環節點起始位置)

9linklist createlist()

21else

2526

if(i == 3

)27 fifthnode =tt;28}

29 prenode->next =fifthnode;

30return

head;31}

3233

///判斷鍊錶是否有環

34 linknode*judgering(linklist list)

46else

47return

null;

4849

if(fast ==slow)

50return

fast;51}

52}5354

///獲取鍊錶環長

55int getringlength(linknode *ringmeetnode)

66return

ringlength;67}

6869

///獲取煉表頭到環連線點的長度

70int getlena(linklist list,linknode *ringmeetnode)

81return

lena;82}

8384

///環起始點

85///

如果有環, 釋放空空間時需要注意.

86 linknode* ringstart(linklist list, int

lena)

9091

int i = 0

;92 linknode* tmp =list;

93for ( ; i < lena; ++i)97}

9899

return (i == lena)?tmp : null;

100}

101102

///釋放空間

103int freemalloc(linklist list, linknode*ringstart)

115free

(list);

116 list =nextnode;

117}

118119

return0;

120}

121122

intmain()

144145 ringstartnode = ringstart(list, lena); //

獲取環起始點

146 freemalloc(list, ringstartnode); //

釋放環節點, 有環時需要注意. 採納5樓建議

147return0;

148 }

執行結果:

本文**:

求有環單鏈表中的環長 環起點 鍊錶長

1.判斷單鏈表是否有環 使用兩個slow,fast指標從頭開始掃瞄鍊錶。指標slow 每次走1步,指標fast每次走2步。如果存在環,則指標slow fast會相遇 如果不存在環,指標fast遇到null退出。就是所謂的追擊相遇問題 2.求有環單鏈表的環長 在環上相遇後,記錄第一次相遇點為pos,之...

求有環單鏈表中的環長 環起點 鍊錶長

求有環單鏈表中的環長 環起點 鍊錶長 1.判斷單鏈表是否有環 使用兩個slow,fast指標從頭開始掃瞄鍊錶。指標slow 每次走1步,指標fast每次走2步。如果存在環,則指標slow fast會相遇 如果不存在環,指標fast遇到null退出。就是所謂的追擊相遇問題 2.求有環單鏈表的環長 在環...

求有環單鏈表中的環長 環起點 鍊錶長

1.判斷單鏈表是否有環 使用兩個slow,fast指標從頭開始掃瞄鍊錶。指標slow 每次走1步,指標fast每次走2步。如果存在環,則指標slow fast會相遇 如果不存在環,指標fast遇到null退出。就是所謂的追擊相遇問題 2.求有環單鏈表的環長 在環上相遇後,記錄第一次相遇點為pos,之...