鍊錶中的環

2021-10-20 09:34:50 字數 1784 閱讀 2763

快慢指標,追及問題,若煉表中存在環,快指標必定會在環中追上慢指標

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。如果鍊錶包含環,那麼入口結點的位址一定出現且僅出現兩次。特別情況就是整個鍊錶是個環,那麼入口結點是這個單鏈表的第乙個結點。要找到整個鍊錶中...