問題:
1.單鏈表是否有環
2.環的節點長度
3.環的入口節點
4.表頭到環入口的節點長度
問題1.思路:
在表頭設定fast、slow指標,fast一次遍歷兩個節點,slow一次遍歷乙個節點,若相遇則證明有環,反之則不存在環
**:
/**
*引入快慢指標,若指標相遇則證明鍊錶有環
*/node * findring(node *head)
return null;
}
問題2.思路:從fast、slow指標相遇開始,再次出發,再次相遇時slow走過的距離即為環的長度
**:
/**
*meetpoint為快慢指標相遇的節點指標
*快慢節點再次相遇的時候,慢指標走過的長度即為環的長度
*/int ringlen(node * meetpoint)
return ringlen;
}
ps:可以直接讓slow重相遇點出發,重新到達相遇點時,即為環的長度
問題3.思路
設指標p指向煉表表頭,q指向slow、和fast的相遇節點,兩個指標同時開始遍歷,當兩個節點相遇時,相遇節點為環入口節點
**:
node * ringentr(node * head , node * meetpoint)
return p;
}
上面這篇部落格對問題三有比較詳細的證明
這裡再解釋一下(思路都是由上面的部落格得來的):
1.剛開始h、fast、slow在表頭,環的入口為t,fast開始一步兩個節點遍歷鍊錶,slow開始以一步乙個節點遍歷鍊錶,h指標不動
2.當slow到達入口t時,設fast在m1,從t到m1的逆時針距離為b,環的長度為r,從m1到t的距離為r-b,同理從fast到slow的距離為也為r-b
3.這時fast可能已經繞了n圈,所以表頭到t的距離a = nr +b
4.設m2為在slow、fast的相遇節點,slow和fast之間的速度差為1,距離差為r-b,時間(r-b)/1 = r-b,slow走過的路徑為(r-b)*1=r-b,所以m2到t的距離為b,h這時從表頭出發,slow繼續遍歷
5.h從表頭出發走過距離為b時,slow到達t點,由3可得 a = nr + b 這時 a - b = nr h到t剩下的距離是環長度的整數倍,故當後到達t時必然與slow相遇
問題4.思路:
在問題3的基礎上,從h出發時加上乙個計數器,當h和slow相遇時既可以的到表頭到環入口的距離
int getlena(node * head,node * meetpoint)
return len;
}
關於單鏈表的幾個問題
q 如何判斷乙個單鏈表是否有環,如果有環,找出環的入口點?a 首先我們判斷鍊錶是否有環,設定兩個指標slow和fast,指向單鏈表的頭部,每個迴圈slow走一步,fast走兩步。如果沒有環,fast或者fast的next會走到null,否則fast在環裡迴圈最終會和slow相遇,此時即存在環。再看第...
關於同比和環比的幾個問題
關於同比和環比的幾個問題 1 環比增長怎麼算 2 環比 與 同比 是什麼意思?區別在 3 如何計算同比增長環比增長以及下降 4 同比和環比怎麼算 5 同比和環比的區別 6 什麼是同比和環比 一 同比和環比的區別同比 與歷史 同時期 比較,例如2011年3月份與2010年3月份相比,叫同比。環比與 上...
單鏈錶環問題
給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?5 如果存在環,求出環上距離任意乙個節點最遠的點 對面節點 6 擴充套件 如何判斷兩個無環鏈表是否相交 7 擴充套件 如果相交,求出第乙個相交的節點 解法 1 對於問題1...