判斷鍊錶是否有環以及求環中第乙個結點

2021-09-08 08:57:04 字數 1252 閱讀 6822

題目:給定單鏈表,如果有環的話請返回從頭結點進入環的第乙個結點。

答:

#include "

stdafx.h

"#include

#include

#include

using

namespace

std;

struct

listnode;//

構造鍊錶

void createlist(listnode *&phead, listnode *&pfirstnode)

else

if (null == pfirstnode && !(rand() % 5

))

fin>>data;

}pnode->m_pnext =pfirstnode;}//

判斷鍊錶是否有環

bool iscircle(listnode *phead)

listnode *pfast =phead;

listnode *pslow =phead;

while (pfast && null != pfast->m_pnext)

}return !(pfast == null || pfast->m_pnext ==null);}//

判斷鍊錶是否有環以及求環中第乙個結點

listnode* findfirstcommonnode(listnode *phead)

listnode *pfast =phead;

listnode *pslow =phead;

while (pfast && null != pfast->m_pnext)

}if((pfast == null || pfast->m_pnext ==null))

pslow =phead;

while (pslow !=pfast)

return

pslow;

}int _tmain(int argc, _tchar*ar**)

else

cout

<

return0;

}

執行介面如下:

建造鍊錶的list.txt檔案如下:

123

4567

891011

1213

1415

0

如何判斷鍊錶是否有環 鍊錶是否有環的判斷

對於鍊錶是否存在環,有三個問題需要考慮 1.是否有環 2.入環節點 3.環的長度 第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向鍊錶的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。1.如果快指標指向空,則鍊錶無環 2.若快指標和慢指標再次指向乙個...

判斷鍊錶是否有環以及尋找環入口

思路 採用 快慢指標 查檢查鍊錶是否含有環。讓乙個指標一次走一步,另乙個一次走兩步,如果鍊錶中含有環,快的指標會再次和慢的指標相遇。這裡需要注意的一點是演算法中迴圈的條件,這是乙個很容易被忽略的細節。1 因為fast指標比slow指標走得快,所以只要判斷fast指標是否為空就好。由於fast指標一次...

判斷鍊錶是否有環

1.如何判斷是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。2.如何計算環的長度?第一次相遇 超一圈 時開始計數,第二次相遇時停止計數。3.如何判斷環的入口點 碰撞點p到連線點的距離 頭指標到連線點的距離,因此,分別從碰撞點 頭指標開始走,相遇的...