1. 程式人生 > >Python實現"環形連結串列"的一種方法

Python實現"環形連結串列"的一種方法

判斷給定的連結串列中是否有環(不一定是首尾相連)

注意:

儘量不要申請額外空間

複雜度O(n)的方法,使用兩個指標slow,fast。兩個指標都從表頭開始走,slow每次走一步,fast每次走兩步,如果fast遇到null,則說明沒有環,返回false;如果slow==fast,說明有環,並且此時fast超了slow一圈,返回true。

為什麼有環的情況下二者一定會相遇呢?因為fast先進入環,在slow進入之後,如果把slow看作在前面,fast在後面每次迴圈都向slow靠近1,所以一定會相遇,而不會出現fast直接跳過slow的情況。

def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if not head:
            return False
        pointer1 = head
        pointer2 = head
        while pointer1 is not None:      
            pointer1=pointer1.next   #指標1加一
            if not pointer2.next:    
                return False
            pointer2 = pointer2.next   #指標2加一
            if not pointer2.next:
                return False
            pointer2 = pointer2.next   #指標2再加一
            if pointer2==pointer1:
                return True
        return False

複雜度O(n^2)的方法,使用兩個指標a, b。a從表頭開始一步一步往前走,遇到null則說明沒有環,返回false;a每走一步,b從頭開始走,如果遇到b==a.next,則說明有環true,如果遇到b==a,則說明暫時沒有環,繼續迴圈。

def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if not head:
            return False
        pointer1 = head
        pointer2 = head
        while pointer1.next is not None:      #挨個訪問結點
            while pointer2!=pointer1:         #從頭開始一直訪問到Pointer1結點
                if pointer2==pointer1.next:
                    return True
                pointer2 = pointer2.next
            if pointer2==pointer1.next:       #防止連結串列最後一個結點自身成環
                return True
            pointer1=pointer1.next
            pointer2=head
        return False

3:新建一個列表,用於存放訪問過的結點,判斷下一個結點是否在列表中(錯誤:超出時間限制

def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if not head:
            return False
        tempNodeList = [head]
        while head.next!=None and head.next not in tempNodeList:
            head = head.next
            tempNodeList.append(head)
        if head.next == None:
            return False
        else:
            return True