如何判斷鍊錶有環的三種解法 Python

2021-10-06 06:31:35 字數 1792 閱讀 4693

一、問題描述

二、解題思路

三、最優解的**實現

一、問題描述

有乙個單向鍊錶,鍊錶中有可能出現環,如何判斷鍊錶是否有環?

二、解題思路

方法一:

首先從頭節點開始,依次遍歷單鏈表中的每乙個節點。每遍歷乙個新節點,就從頭檢查新節點之前的所有結點,用新節點和此結點之前的所有結點依次作比較。如果發現該節點和之前的某個節點相同,則說明該節點被遍歷過兩次,鍊錶有環;如果之前的所有結點中不存在與新節點相同的結點,就繼續遍歷下乙個新節點,繼續重複剛剛的操作。

該方法的時間複雜度為o(n^2),空間複雜度為o(1)

方法二:

首先建立乙個結點集合,用來儲存曾經遍歷過的結點。同樣是從頭節點開始,依次遍歷單鏈表中的每乙個結點。每遍歷乙個新節點,就用新節點和集合中的結點進行比較,如果集合中存在與之相同的結點,則說明鍊錶有環。如果不存在,就把該節點存入集合中,繼續重複剛剛的操作。

該方法的時間複雜度為o(n),空間複雜度為o(n)

方法三:

首先建立兩個指標p1、p2(在python中就是兩個物件引用),讓它們同時指向這個鍊錶的頭節點。然後開始乙個大迴圈,在迴圈體中,讓指標p1每次向後移動乙個節點,讓指標p2每次向後移動兩個節點,然後比較兩個指標指向的節點是否相同。如果相同,則可以判斷出煉表有環,如果不同,則繼續下一次迴圈。

這種方法類似於追及問題

在乙個環形跑道上,兩個運動員從同一起點跑,乙個運動員速度快,乙個運動員速度慢。當兩個人跑了一段時間後,速度快的運動員就會再次追上並且超過速度慢的運動員。

該方法的時間複雜度為o(n),空間複雜度為o(1)

三、最優解的**實現

判斷鍊錶是否有環 三種思路

給定乙個鍊錶,判斷鍊錶中是否有環。注 這個環可以是尾節點連線到前面的任意乙個節點 最容易想到的,就是每遇到乙個節點,如果不存在,就把它存入雜湊表,存在就直接返回true。沒有乙個重複的就返回false。注意 優劣勢分析 這是乙個常識,如果在乙個環形跑道上賽跑,快的人和慢的人一定會相遇。所以我們可以使...

如何判斷鍊錶有環

假設存在環,環前共l個節點,環中共c個節點.設乙個慢指標起始位置為a,速度為1,快指標起始位置為b,速度為2.t時間後,二者相遇,可列方程 a t l mod c b 2 t l mod c 即t a b mod c 該模線性方程必定有解.所以無論a,b的起始位置如何,二者總是會相遇的.struct...

如何判斷鍊錶有環?

題目描述 如果有乙個單向鍊錶,鍊錶當中有可能出現 環 就像下圖這樣,如何判斷這個鍊錶是有環鏈表?方案一 暴力法 從頭節點,依次遍歷單鏈表的每乙個節點,每到乙個新的節點就頭節點重新遍歷之前的所有的節點,對比此時的節點,如果相同,證明該節點遍歷過兩次,以此說明鍊錶是有環的 偽 node p head.n...