鍊錶環相關演算法問題

2021-09-03 05:13:59 字數 1468 閱讀 9094

這些演算法問題網上有很多講解的,因為要設計到一些數學的邏輯推算問題,所以看了很多剛開始真是沒動整個推演過程是什麼樣子的,活生生從早

上6點搞到下午有時間就想一下,沒想上了趟廁所回來就知道怎麼回事了,記錄一下,以防再次忘記。

另乙個要掌握的理由就是這都是特別經典的 演算法題,雖然不用但是面試還是會常常被問到的

這個問題我還是用快慢針吧,效率上是最高的時間複雜度為o(n),

public

static

void

main

(string[

] args)

//快慢針法檢測鍊錶是否有環

public

static

boolean

check

(node node)

}return

false;}

public

static

class

node

int data;

node next;

@override

public string tostring()

';}}

日誌2----33

----54

----75

----46

----

6組中快慢針相遇,證明了有環的存在

我就是在這裡坑了很久出不來,看別人的**的時候就覺得很簡單,但是自己那張紙 拿著筆 手寫你試試,如何推演的就比較難了,畢竟涉及到了數學問題。

快慢針法:

假設 :慢針速度為v 快針為2v 快慢針在b點相遇,環的起始點為a 環的周長為 r ,b到 a的距離為c

則我們得到以下公式:

1.兩者到相遇走的路程為s1=a+b ; s2=a+b+n*r s2=2*s1

2.由上得到 2(a+b)=a+b+n*r 則 a+b =n*r a=n*r-b

3.因為環長為r b+c=r 則 a=n*r-(r-c)

4.最終得到 a=(n-1)r+c

從最終的結論中我們可以看出,第一圈的時候a=c ,那我們想要找到起始點則讓快針回到head一次走一步,慢針從相遇點一次走一步,相遇時

就是環的起始點了

public

static node getnode

(node node)

} node result = null;

//如果有環,則讓快針回到起點,因為兩者到環起點的距離相等,所以兩者同時每次移動,相遇的時候就是環的起點

if(iscircle)}}

return result;

}

鍊錶系列 鍊錶環相關問題

設定兩個節點 slow fast,若存在環,分別從鍊錶的頭節點出發,乙個每次向後移動一步,另乙個移動兩步,兩個指標移動速度不一樣,如果存在環,那麼兩個指標一定會在環裡相遇。public boolean hascircle node head node slow head node fast head...

鍊錶中與環相關的問題

141.linked list cycle given a linked list,determine if it has a cycle in it.follow up can you solve it without using extra space?subscribe to see whic...

鍊錶環問題

給定乙個鍊錶,判斷該鍊錶中是否有環?如果有的話,環的長度是多少?環的入口是哪個節點?使用快慢指標策略,兩個指標都從頭指標出發,快指標每次走兩步,慢指標每次走一步。1.判斷鍊錶是否有環?如果快慢節點相遇,那麼鍊錶有環。2.如果有環,環的長度是多少?快慢指標相遇後,固定其中乙個指標 如快指標 不動,另乙...