題目:給定單鏈表,如果有環的話請返回從頭結點進入環的第乙個結點。
答:
#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檔案如下:
1234567
891011
1213
1415
0
如何判斷鍊錶是否有環 鍊錶是否有環的判斷
對於鍊錶是否存在環,有三個問題需要考慮 1.是否有環 2.入環節點 3.環的長度 第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向鍊錶的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。1.如果快指標指向空,則鍊錶無環 2.若快指標和慢指標再次指向乙個...
判斷鍊錶是否有環以及尋找環入口
思路 採用 快慢指標 查檢查鍊錶是否含有環。讓乙個指標一次走一步,另乙個一次走兩步,如果鍊錶中含有環,快的指標會再次和慢的指標相遇。這裡需要注意的一點是演算法中迴圈的條件,這是乙個很容易被忽略的細節。1 因為fast指標比slow指標走得快,所以只要判斷fast指標是否為空就好。由於fast指標一次...
判斷鍊錶是否有環
1.如何判斷是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。2.如何計算環的長度?第一次相遇 超一圈 時開始計數,第二次相遇時停止計數。3.如何判斷環的入口點 碰撞點p到連線點的距離 頭指標到連線點的距離,因此,分別從碰撞點 頭指標開始走,相遇的...