使用快慢指標判斷鍊錶是否有環

2021-09-11 08:16:35 字數 1951 閱讀 4620

今天做到leetcode 141: linked list cycle,判斷鍊錶是否存在環,因為看到題目中的val都是整數,所以我是將每個node用1.1作為值去mark了,如果head.next的val是1.1,就說明我指向的下個結點已經走過了,這就是乙個環,如果走到最後head走到none了還沒返回true,那麼這個鍊錶就是沒有環的,return false。

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class solution(object):

def hascycle(self, head):

""":type head: listnode

:rtype: bool

"""while head!= none:

if head.val == 1.1:

return true

if head.next != head:

head.val = 1.1

head = head.next

else:

return true

return false

有點取巧地用了val都是整數來用浮點數進行mark走過的結點,問題給出的標準解答是用快慢指標,**如下

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class solution(object):

def hascycle(self, head):

""":type head: listnode

:rtype: bool

"""try:

slow = head

fast = head.next

while slow is not fast:

slow = slow.next

fast = fast.next.next

return true

except:

return false

快慢指標為什麼能判斷單鏈表是否有環呢,就像在大學跑5000公尺一樣,我們的場地都是400公尺的圈。假設跑的距離足夠長,現在有一位跑的快的選手和跑的慢的選手,如果是跑圈圈的話,快人肯定會領先慢人一圈後又追上他,甩他一圈。如果沒有圈圈,跑直線的話,快人永遠在慢人前面,不會再跟他相遇了。

在單鏈表裡,快人就是快指標,慢人就是慢指標,有環的情況就是他們倆跑圈圈,起跑後快指標總會再一次與慢指標相遇,無環的情況就是起跑後他們不會再相遇。

如何來創造快指標和慢指標呢,我們設定快指標一次跨兩步(每次更新為fast = fast.next.next),慢指標一次跨一步(slow = slow.next)

接下來進行判斷,用while迴圈來一直更新快慢指標的跑動,條件是只要沒有追上就一直更新,讓他繼續跑,滿足快慢指標相等時結束while迴圈(while slow is not fast)。結束了後return true,因為我快慢指標相遇了,必存在環。如果快指標都跑到終點了(none)或者fast.next到終點了,那麼這就是個直線賽道,return false。

還有其他應用比如找有序鍊錶的中位數,找到鍊錶中倒數第k個結點,都用到了快指標達到終點時,慢指標到達位置是我們想要的位置這一屬性。

總結一下:

快慢指標有兩個好用的地方

如果有環,快指標必然會再次與慢指標相遇

快指標到終點時,慢指標的位置可以成為我們需要的元素,這取決於我們隊兩個指標步長的設計

快慢指標判斷鍊錶是否有環

關於鍊錶是否有環,其實是一系列問題,主要包括以下幾個 使用快慢指標fast和slow,fast每次走兩步,slow每次走一步,如果有環,肯定會相遇,如果沒有,則指標fast遇到null退出。追及相遇問題。在環上相遇後,記錄第一次相遇點為pos,之後指標slow繼續每次走1步,fast每次走2步。在下...

雙指標(快慢指標)判斷鍊錶是否有環

單鏈表的特點是每個節點知道下乙個節點 如果用乙個指標來判斷是否有環,當沒有環時,指標一直會指到鍊錶的為即指到null,但是當有環時,指標將陷入死迴圈,因為環形鍊錶中沒有null指標作為尾部節點 while head null head head.next return false 找到一種經典解法 ...

判斷乙個鍊錶是否有環(快慢指標)

1.問題描述 給出乙個鍊錶判斷該鍊錶是否有環 2.思路分析 我們可以使用一種比較經典的方式來進行處理,就是使用兩個指標來進行移動,乙個為快指標,乙個為慢指標,快指標一次移動兩步,慢指標一次移動一步,假如鍊錶有環的話那麼這兩個指標一定會在某乙個地方會相遇的,為什麼呢?有沒有可能不會相遇呢?答案是不可能...