1. 程式人生 > >LeetCode程式設計集訓第2次

LeetCode程式設計集訓第2次

一、單鏈表定義

單鏈表是一種鏈式存取的資料結構,用一組地址任意的儲存單元存放線性表中的資料元素
連結串列中的資料是以結點來表示的,每個結點的構成:元素(資料元素的映象) + 指標(指示後繼元素儲存位置),元素就是儲存資料的儲存單元,指標就是連線每個結點的地址資料。

第一題(142)

內容表述:

給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null

為了表示給定連結串列中的環,我們使用整數 pos 來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。 如果 pos-1,則在該連結串列中沒有環。

說明:

不允許修改給定的連結串列。

 

示例 1:

輸入:head = [3,2,0,-4], pos = 1
輸出:tail connects to node index 1
解釋:連結串列中有一個環,其尾部連線到第二個節點。

示例 2:

輸入:head = [1,2], pos = 0
輸出:tail connects to node index 0
解釋:連結串列中有一個環,其尾部連線到第一個節點。

示例 3:

輸入:head = [1], pos = -1
輸出:no cycle
解釋:連結串列中沒有環。

 

解題方案1:

思路:遍歷單鏈表,同時將 結點進行比較和加入雜湊表,則環的入口是雜湊表裡的第一個重複的結點。

程式碼:

class Solution(object):
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        hash_table = set()  # 初始化一個雜湊表
        while head:  # 開始遍歷單鏈表
            if head in hash_table:
                return head  # 返回雜湊表中已存在的結點
            else:
                hash_table.add(head)  # 雜湊表裡沒有的加入雜湊表中
            head = head.next  # 結點後移

        return None  # 連結串列無環

解題方案2:

思路:設定兩個指標,比如慢指標一次移動一個結點,快指標一次移動兩個結點。若有環,則兩個指標會在環中某個位置相遇。經過計算會得知:頭結點距環起點和相遇點距環起點距離一致。先找到相遇點,然後設定速度一致的兩個指標,分別從起點和相遇點開始移動,直到兩者相遇, 該店即為環起點

程式碼:

class Solution(object):
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head is None:
            return None
        if head.next is None:
            return None
        first = second = head
        while second.next and second.next.next: # 注意判斷條件
            first = first.next
            second = second.next.next
            if first == second: # 找到相遇點
                p = head # 從頭節點開始遍歷
                while first != p: # 需要進行數學上的計算
                    p = p.next
                    first = first.next
                return p
        return None

第二題(206)

內容描述:

反轉一個單鏈表。

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

解題方案:

思路:遍歷連結串列,選擇頭插法

程式碼:

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        cur, pre = head, None

        while cur:
            cur.next, pre, cur = pre, cur, cur.next  # python中的多賦值,屬於一次賦值,是同時進行的,變數之間的相互賦值不受彼此影響。
        return pre