連結串列找環(python實現)

伯納烏掃地老僧發表於2018-08-30

具體思路我就不在這照貓畫虎啦,具體的演算法思路可以看一下這篇文章,文章思路很清晰,文筆很詼諧幽默,我就直接上程式碼吧,python語言實現:

# coding:utf-8

#節點類
class Node(object):

    def __init__(self, value):
        self.val = value
        self.next = None

#連結串列找環方法一
#用一個列表來儲存走過的連結串列結點,然後在遍歷節點過程觀察結點是否會重複出現
def findloop(start):
    vector = []
    while start:
        if start in vector:
            return True
        vector.append(start)
        start = start.next
    return False
#這種思路的時間複雜度為O(n*n),空間複雜度為O(n)(用了一個臨時列表儲存被遍歷過的節點)

##=====================================分割線=====================================##

#連結串列找環方法二
#快慢指標法,如果連結串列有環,那麼快的指標一定會再次遇到慢的指標(可以參考美隊二片頭
#美隊和獵鷹跑步那個場景)
def newfindloop(start):
    first = start
    second = start
    while second:
        first = first.next
        if second.next == None:
            return False
        second = second.next.next
        if first == second:
            return True
    return False
#這種思路時間複雜度為O(n),空間複雜度為O(1)


#建立一個連結串列
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
print(findloop(node1))
print(newfindloop(node1))

 

相關文章