今天做到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.思路分析 我們可以使用一種比較經典的方式來進行處理,就是使用兩個指標來進行移動,乙個為快指標,乙個為慢指標,快指標一次移動兩步,慢指標一次移動一步,假如鍊錶有環的話那麼這兩個指標一定會在某乙個地方會相遇的,為什麼呢?有沒有可能不會相遇呢?答案是不可能...