這是我參與8月更文挑戰的第7天,活動詳情查看:8月更文挑戰面試
想要堅持寫點什麼,那乾脆寫一個系列吧。想一想有什麼能夠寫的呢?程序=算法+數據結構,可見算法的重要性。這個系列老詩力求用最簡單的語言把算法講得明明白白,由淺到深,有興趣的話,能夠關注一下專欄。算法
上一篇文章寫了鏈表的基本操做,包括新建鏈表,插入鏈表節點,刪除鏈表節點,查詢鏈表結點等內容。 如今這一篇是講如何判斷鏈表是否有環的算法。面試中這一題目是比較常見的。markdown
對於這個問題咱們能夠採用「快慢指針」的方法。就是有兩個指針fast和slow,開始的時候兩個指針都指向鏈表頭head,而後在每一步操做中slow向前走一步即:slow = slow->next,而fast每一步向前兩步即:fast = fast->next->next。因爲fast要比slow移動的快,若是有環,fast必定會先進入環,而slow後進入環。當兩個指針都進入環以後,通過有限的操做次數以後,快慢指針是一定會相遇的。數據結構
具體代碼以下:oop
//快慢指針判斷是否有環
bool exitLoop(Node *head)
{
Node *fast, *slow ;
slow = fast = head ;
while (slow != NULL && fast -> next != NULL)
{
slow = slow -> next ;
fast = fast -> next -> next ;
if (slow == fast)
return true ;
}
return false ;
}
複製代碼
如上圖所示post
也就是說,slow每次向前走一步,fast向前追了兩步,所以每一步操做後fast到slow的距離縮短了1步,這樣繼續下去就會使得二者之間的距離逐漸縮小:...、五、四、三、二、一、0 -> 相遇。又由於在同一個環中fast和slow之間的距離不會大於換的長度,所以到兩者相遇的時候slow必定尚未走完一週(或者正好走完之後,這種狀況出如今開始的時候fast和slow都在環的入口處)。學習
想要學習更多算法問題,或者要更多項目源碼,請移步到公衆號:詩同樣的代碼。spa
既然進來了,原創不易。小夥伴點個贊再走唄。指針