快慢指標,追及問題,若煉表中存在環,快指標必定會在環中追上慢指標
public
static
boolean
iscycle
(node header)
node fast = header;
node slow = header;
// 快指標不為空,慢指標必不為空
while
(fast != null && fast.next != null)
return
false
;}
快指標的速度是慢指標的2倍,當兩指標第二次在環中相遇時,快指標比慢指標多走的部分即是環的長度
public
static
intgetcyclelength
(node header)
node fast = header;
node slow = header;
int res =0;
// 快指標不為空,慢指標必不為空
while
(fast != null && fast.next != null)
while
(slow != fast)
;// 直到第二次相遇
如圖,第一次相遇時候,慢指標走過的路徑是
s =l
1+l2
s=l_1+l_2
s=l1+
l2快指標走過的路徑是(n為快指標比慢指標多走的圈數)
f =l
1+l2
+n(l
2+l3
)f = l_1 +l_2+ n(l_2+l_3)
f=l1+
l2+
n(l2
+l3
)因為快指標速度是慢指標的2倍,所以
2 (l
1+l2
)=l1
+l2+
n(l2
+l3)
2(l_1+l_2)=l_1 +l_2+ n(l_2+l_3)
2(l1+
l2)
=l1
+l2
+n(l
2+l
3)最終得:
l 1=
(n−1
)(l2
+l3)
+l3l_1=(n-1)(l_2+l_3)+l3
l1=(n
−1)(
l2+
l3)
+l3當n=1時,l1=l3,所以,當兩指標第一次相遇時,只需將其中乙個指標重置到鍊錶起點,然後兩指標每次後移乙個節點,再次相遇的地方就是環的入口點了
public
static node getcycleentrynode
(node header)
node fast = header;
node slow = header;
// 快指標不為空,慢指標必不為空
while
(fast != null && fast.next != null)
return slow;}}
return null;
}
檢測鍊錶中的環
問題描述 給定乙個鍊錶,檢測該鍊錶中是否存在閉環。要求時間和空間複雜度。問題分析 如果存在環,那麼我們在遍歷鍊錶的時候最終會進入一條無限迴圈中。我們可以把這視為2個人在操作運動,速度快的最終一定會趕上並且遇上速度慢的,也就是速度快的會比速度慢的多跑n整圈。假設a和b倆個物體運動,速度分別為va,vb...
鍊錶中的環入口節點
public class 鍊錶中的環入口節點 計算環的長度 int lengthofcycle 1 listnode curnode meetnode while curnode.next meetnode 找出入口節點 利用快慢指標,前者先行lengthofcycle個節點,然後兩者同時前進當fa...
鍊錶中的環的入口結點
學習內容 鍊錶中的環的入口結點 1 思路 如果鍊錶是乙個空鍊錶,或者只有乙個結點的鍊錶,答案是null。如果鍊錶是至少有兩個結點的線性鍊錶,那麼答案也是null。如果鍊錶包含環,那麼入口結點的位址一定出現且僅出現兩次。特別情況就是整個鍊錶是個環,那麼入口結點是這個單鏈表的第乙個結點。要找到整個鍊錶中...