判斷單鏈表是否有環,並找出環的入口python


1、如何判斷一個鏈表是否有環?

2、如果鏈表為存在環,如果找到環的入口點?

1.限制與要求

  • 不允許修改鏈表結構。
  • 時間復雜度O(n),空間復雜度O(1)。

2.思考

2.1判斷是否有環

如果鏈表有環,那么在遍歷鏈表時則會陷入死循環,利用這個特征,我們可以設計這樣的算法。

  • 使用一個slow指針,一個fast指針。
  • slow指針一次往后遍歷以1個節點,fast指針一次往后遍歷2個節點,一直做這樣的操作。

  • 如果fast指針在遍歷過程中,遍歷到了NULL節點說明鏈表沒有環。

  • 否則當slow指針和falst指針相同,則說明環有節點。

2.2環的入口節點

我們假定鏈表頭到環入口的距離是len,環入口到slow和fast交匯點的距離為x,環的長度為R。slow和fast第一次交匯時,設slow走的長度為:d = len + x,而fast走的長度為:2d = len + nR + x,(n >= 1),從而我們可以得知:2len + 2x = len + nR + x,即len = nR - x,(n >= 1),於是我們可以得到這樣的算法。

  • 使用一個cur指針指向鏈表頭節點,一個inter指針指向第一次的交匯點。

  • cur指針和inter指針一起往后遍歷。

  • cur指針和inter指針相等時,cur和inter指針指向的就是環的入口節點。

 

inter指針在遍歷過程中可能多次(n >= 1)經過環入口節點,但當cur指針第一次達到入口節點時,inter指針此時必然也指向入口節點。

 


class Node():
def __init__(self,item):
self.item =item
self.next=None

def test(head):
low = head
high = head
cur = None
if head==None:
return False
while high.next!=None and high.next.next!=None:
low = low.next
high = high.next.next
if low==high:
cur = low
l = head
while cur.next:
cur=cur.next
l=l.next
if cur==l:
return l.item
return False

node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node5 = Node(5)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node2

t=test(node1)
print(t)

判斷兩個單鏈表是否相交,如果相交,給出相交的第一個點(兩個鏈表都不存在環)。
使用哈希表,即python中的字典。先遍歷一個鏈表,並將鏈表內容放入字典。再遍歷另外一個鏈表,看遍歷到的位置是否存在於字典中,存在則返回當前結點。若遍歷結束仍不存在則返回空。檢索復雜度為O(m+n),空間復雜度O(m+n)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM