判定乙個鍊錶是否有環
這張圖不存在環,頭結點是1,尾結點是5。
這張圖中,節點2-3-4-5-2就構成了環。
思路1 ——快慢指標
顧名思義,乙個快指標,乙個慢指標。
如果不包括環,快慢指標同向行駛,根據小學經典數學題,他們永遠無法相遇,而且差距只會越來越大。
如果鍊錶有環,意味著快慢指標都會調頭,好比操場跑步,第一圈快指標在慢指標前面,但是後面快指標遲早會追上慢指標。所以可以借助這個思想,使用快慢指標判定是否有環。
圖中,slow代表慢指標,每次只走一步,fast代表快指標,每次走兩步。
第一次:slow停在節點2,fast停在節點3
第二次:slow停在節點3,fast停在節點5
第三次:slow停在節點4,fast停在節點3
第四次:slow停在節點5,fas停在節點5
至此,快指標已經」攆上「了慢指標。
**實現
func hascycle(head *listnode) bool else思路2——另闢蹊徑} return false
}
遍歷鍊錶,如果節點的值與乙個特殊的值不相等,則將遍歷過的節點的值設定成乙個特殊的值,相當於打標記。
如果鍊錶遍歷完,發現所有節點都不等於這個特殊的值,則判定鍊錶無環。
如果在遍歷的過程中,發現有節點等於這個特殊的值,則認為有環。
**實現
func hascycle2(head *listnode02) bool只能說,第乙個想到這個思路的,腦洞是有多大~for head != nil
head.val = 5201314
head = head.next
}return false
}
老王:你不好好種地,你以後長大能幹什麼
小王:學演算法
老王:學演算法?!你陣列、鍊錶、棧、佇列、堆、排序、查詢都整不明白,你學什麼演算法
小王:我只學如何判斷鍊錶是否有環
老王:。。。
日拱一卒 鍊錶 鍊錶反轉(遞迴解法)
上篇我們主要介紹鍊錶反轉的原地反轉解法。除此以外,是否還有其他解法?當然,今天就來看看鍊錶反轉的遞迴解法。遞迴,字面意思,有 遞 也有 歸 拿我們經常聽到的斐波那契數列來說,公式如下 f n f n 1 f n 2 f 1 1,f 2 1 現在比如求解f 5 的值,按照公式,可以展開為f 5 f 4...
日拱一卒 鍊錶 如何實現lru
redis的記憶體淘汰機制好幾種,如ttl random lru。lru less recently used 即最近最少使用策略,表示在最近一段時間內最少被使用到的redis鍵,如果遇到記憶體不足,會有限淘汰這部分鍵來騰出更多空間。今天就來說說lru這種淘汰策略是如何通過鍊錶這種結構實現的。在鍊錶...
如何判斷鍊錶是否有環 鍊錶是否有環的判斷
對於鍊錶是否存在環,有三個問題需要考慮 1.是否有環 2.入環節點 3.環的長度 第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向鍊錶的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。1.如果快指標指向空,則鍊錶無環 2.若快指標和慢指標再次指向乙個...