【数据结构与算法】判断单链表是否有环的算法
帶環(huán)鏈表
這里的帶環(huán)單鏈表可不是環(huán)形單鏈表,這個環(huán)可能是我們不想要的,所以需要檢測。
我們就不假設(shè)有一個打結(jié)狀的環(huán)了,那樣跑到哪里去也不清楚,這里的“帶環(huán)鏈表”,環(huán)必然是在末端。
這是經(jīng)典問題,方法眾多,但方法效率差別很大,本文試舉三例,并對較優(yōu)算法加以編程實(shí)現(xiàn)。
算法一:暴力查重
雙指針即可,前一個指針在遍歷單鏈表,后一個指針遍歷前指針之前的所有結(jié)點(diǎn)是否有與前指針相同的結(jié)點(diǎn)。
如果能跑到結(jié)尾,自然是無環(huán)的,否則就跑下去,總會發(fā)現(xiàn)的。
這算法很暴力,不好。
算法二:HashSet查重
不需要雙指針,但需要多費(fèi)一些空間,建一個HashSet,里面裝每一個搜索過的結(jié)點(diǎn),搜到的結(jié)點(diǎn)如果Set里有,就是說明了有環(huán),否則就把新搜到的結(jié)點(diǎn)加入HashSet里面。搜到盡頭就是沒環(huán)。
算法三:雙指針
前一個指針一次跳兩個結(jié)點(diǎn),后一個結(jié)點(diǎn)一次跳一個結(jié)點(diǎn),如果有環(huán),則前后必能相遇。如果前者跑到盡頭就說明沒環(huán)。
算法核心代碼(Java語言描述):
private boolean isCircular總結(jié)
以上是生活随笔為你收集整理的【数据结构与算法】判断单链表是否有环的算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】浅析堆栈以及数据结构的
- 下一篇: 软件工程知识——软件配置管理