【面試經典題】判斷鏈表是否有環| 8月更文挑戰

這是我參與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 ; 
} 
複製代碼

22222.png

如上圖所示post

也就是說,slow每次向前走一步,fast向前追了兩步,所以每一步操做後fast到slow的距離縮短了1步,這樣繼續下去就會使得二者之間的距離逐漸縮小:...、五、四、三、二、一、0 -> 相遇。又由於在同一個環中fast和slow之間的距離不會大於換的長度,所以到兩者相遇的時候slow必定尚未走完一週(或者正好走完之後,這種狀況出如今開始的時候fast和slow都在環的入口處)。學習

想要學習更多算法問題,或者要更多項目源碼,請移步到公衆號:詩同樣的代碼spa

既然進來了,原創不易。小夥伴點個贊再走唄指針

相關文章
相關標籤/搜索