如何檢測鏈表中是存在循環


  鏈表在面試中出現的頻率很高,有的比較正常,考鏈表的常規操作,主要看基本功是否扎實,有些就比較難,難在思維的改變和是否能夠想到對應的點。這里出現的是其中一個題目,我稱之為有環鏈表問題。也就是從判斷一個單鏈表是否存在循環而擴展衍生的問題。下面來看問題如何解決。
  首先來看最基本的這個問題:如何判斷一個單鏈表是否存在循環,鏈表數目未知。算法不能破壞鏈表。

思路一:哈希表法

將所有的遍歷過的節點用哈希表存儲起來,用節點的內存地址作為哈希表的值存儲起來。每遍歷一個節點,都在這個結構中查找是否遍歷過。如果找到有重復,則說明該鏈表存在循環。如果直到遍歷結束,則說明鏈表不存在循環。哈希表中存儲的值為節點的內存地址,這樣查找的操作所需時間為O(1),遍歷操作需要O(n),hash表的存儲空間需要額外的O(n)。所以整個算法的時間復雜度為O(n),空間復雜度為O(n)。

思路二:反轉指針法

這種比較特別,是使用反轉指針的方法,每過一個節點就把該節點的指針反向。當有環的時候,最后指針會定位到鏈表的頭部,如果到最后,都沒有再到頭部,那說明鏈表不存在循環。這個方法會破壞掉鏈表,所以如果要求是不能破壞鏈表的話,我們最后就還需要反轉一下,再將鏈表恢復(題目說不能破壞環,那我破壞之后恢復原樣也算沒破壞環呀。哈哈,思路不要被局限住了)。這個方法使用的空間復雜度為O(1),其實是使用了3個指針,用於進行反轉。同時,時間復雜度為O(n)。

思路三:快慢指針(是錯的!)

首先我們要理解什么是快慢指針。快指針pf(f就是fast的縮寫)每次移動2個節點,慢指針ps(s為slow的縮寫)每次移動1個節點,如果快指針能夠追上慢指針,那就說明其中有一個環,否則不存在環。

這個方法的時間復雜度為O(n),空間復雜度為O(1),實際使用兩個指針。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM