日拱一卒 鍊錶 判斷鍊錶是否有環

2022-01-19 11:59:38 字數 1327 閱讀 5772

判定乙個鍊錶是否有環

這張圖不存在環,頭結點是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 

} return false

}

思路2——另闢蹊徑

遍歷鍊錶,如果節點的值與乙個特殊的值不相等,則將遍歷過的節點的值設定成乙個特殊的值,相當於打標記。

如果鍊錶遍歷完,發現所有節點都不等於這個特殊的值,則判定鍊錶無環。

如果在遍歷的過程中,發現有節點等於這個特殊的值,則認為有環。

**實現

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.若快指標和慢指標再次指向乙個...