鍊錶系列 鍊錶環相關問題

2021-08-24 23:34:40 字數 1875 閱讀 5537

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

public

boolean

hascircle

(node head)

node slow = head;

node fast = head;

while

(fast != null && fast.next != null)

}return

false

;}

頭結點和相遇結點時,將slow指向root,同步前進,則最後一定相遇在環入口結點。

/**

* 返回迴圈的入口節點:

* * slow: a + b = n

* fast: a + b + kl = 2n

* * 相遇時:n = kl = a+b

* * slow 再走 n 步的話,還可以再回到相遇點,

* fast 從頭開始走的話,經過n步,也會達到相遇點m

** @return

*/public node findloopenter

(node head)

node slow = head;

node fast = head;

while

(fast != null && fast.next != null)}if

(slow != fast)

fast = head;

while

(fast != slow)

return fast;

}

// 獲取環的入口位址、迴圈一圈、每次加1

public

intcirclelength

(node root)

node n=node.next;

int length=1;

while

(n!=node)

return length;

}

兩個無環單鏈表是否相交,給出相交的第乙個結點

/**

* 無環鏈表相交的節點:

* 方法1、先計算長度,在同步走比較

* * 方法2、遞迴或棧逆向對比

** @return

*/public node findintersectnode

(node head1, node head2)

stack

stack1 =

newstack

<

>()

; stack

stack2 =

newstack

<

>()

;while

(head1 != null)

while

(head2 != null)

node point = null;

while

(!stack1.

isempty()

&&!stack2.

isempty()

)else

}return point;

}

兩個有環鏈表是否相交

找到第乙個鍊錶的環點,然後將環斷開(當然不要忘記了儲存它的下乙個節點),然後再來遍歷第二個鍊錶 ,如果發現 第二個鍊錶從有環變成了無環,那麼他們就是相交的嘛,否則就是不相交的了.

兩個環相交必定存在公共的迴圈鏈部分,斷開乙個環另乙個必定斷開

注: 當乙個鍊錶中有環,乙個鍊錶中沒有環時,兩個鍊錶必不相交

鍊錶環相關演算法問題

這些演算法問題網上有很多講解的,因為要設計到一些數學的邏輯推算問題,所以看了很多剛開始真是沒動整個推演過程是什麼樣子的,活生生從早 上6點搞到下午有時間就想一下,沒想上了趟廁所回來就知道怎麼回事了,記錄一下,以防再次忘記。另乙個要掌握的理由就是這都是特別經典的 演算法題,雖然不用但是面試還是會常常被...

鍊錶 鍊錶環問題總結

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...

鍊錶環問題

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