如何检测链表中是存在循环
鏈表在面試中出現(xiàn)的頻率很高,有的比較正常,考鏈表的常規(guī)操作,主要看基本功是否扎實,有些就比較難,難在思維的改變和是否能夠想到對應的點。這里出現(xiàn)的是其中一個題目,我稱之為有環(huán)鏈表問題。也就是從判斷一個單鏈表是否存在循環(huán)而擴展衍生的問題。下面來看問題如何解決。
首先來看最基本的這個問題:如何判斷一個單鏈表是否存在循環(huán),鏈表數(shù)目未知。算法不能破壞鏈表。
思路一:哈希表法
將所有的遍歷過的節(jié)點用哈希表存儲起來,用節(jié)點的內(nèi)存地址作為哈希表的值存儲起來。每遍歷一個節(jié)點,都在這個結(jié)構(gòu)中查找是否遍歷過。如果找到有重復,則說明該鏈表存在循環(huán)。如果直到遍歷結(jié)束,則說明鏈表不存在循環(huán)。哈希表中存儲的值為節(jié)點的內(nèi)存地址,這樣查找的操作所需時間為O(1),遍歷操作需要O(n),hash表的存儲空間需要額外的O(n)。所以整個算法的時間復雜度為O(n),空間復雜度為O(n)。
思路二:反轉(zhuǎn)指針法
這種比較特別,是使用反轉(zhuǎn)指針的方法,每過一個節(jié)點就把該節(jié)點的指針反向。當有環(huán)的時候,最后指針會定位到鏈表的頭部,如果到最后,都沒有再到頭部,那說明鏈表不存在循環(huán)。這個方法會破壞掉鏈表,所以如果要求是不能破壞鏈表的話,我們最后就還需要反轉(zhuǎn)一下,再將鏈表恢復(題目說不能破壞環(huán),那我破壞之后恢復原樣也算沒破壞環(huán)呀。哈哈,思路不要被局限住了)。這個方法使用的空間復雜度為O(1),其實是使用了3個指針,用于進行反轉(zhuǎn)。同時,時間復雜度為O(n)。
思路三:快慢指針(是錯的!)
首先我們要理解什么是快慢指針。快指針pf(f就是fast的縮寫)每次移動2個節(jié)點,慢指針ps(s為slow的縮寫)每次移動1個節(jié)點,如果快指針能夠追上慢指針,那就說明其中有一個環(huán),否則不存在環(huán)。
這個方法的時間復雜度為O(n),空間復雜度為O(1),實際使用兩個指針。
想像一種情況,當快指針走到一個環(huán)的時候,慢指針還離快指針很遠,甚至當快指針走出環(huán)的時候慢指針還沒到達環(huán),這時候快指針永遠不會追上慢指針。所以快慢指針無法解決鏈表存在循環(huán)的問題,快慢指針能解決的只是鏈表存在環(huán)的問題,也就是這個循環(huán)在鏈表尾部。可以說鏈表存在環(huán)是鏈表存在循環(huán)的一種特殊情況。
轉(zhuǎn)載于:https://www.cnblogs.com/chanshuyi/p/5314391.html
總結(jié)
以上是生活随笔為你收集整理的如何检测链表中是存在循环的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot 配置文件 appl
- 下一篇: iOS技术周报-第28期