設定兩個節點:slow、fast,若存在環,分別從鍊錶的頭節點出發,乙個每次向後移動一步,另乙個移動兩步,兩個指標移動速度不一樣,如果存在環,那麼兩個指標一定會在環裡相遇。
頭結點和相遇結點時,將slow指向root,同步前進,則最後一定相遇在環入口結點。public
boolean
hascircle
(node head)
node slow = head;
node fast = head;
while
(fast != null && fast.next != null)
}return
false
;}
/**
* 返回迴圈的入口節點:
* * 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.如果有環,環的長度是多少?快慢指標相遇後,固定其中乙個指標 如快指標 不動,另乙...