一週編程集訓day2:鏈表

一週編程集訓day2:鏈表

1 任務

鏈表:學習單鏈表知識,實踐環形鏈表(142,要求至少兩種方法!)及反轉一個單鏈表(206),不限制語言!

2 概念介紹

單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素

鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示後繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。
在這裏插入圖片描述

3 leetcode

1.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
解釋:鏈表中沒有環。

python解答思路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  # 鏈表無環

leetcode提交結果:
在這裏插入圖片描述
python解答思路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

leetcode提交結果:
在這裏插入圖片描述
2.206. 反轉鏈表

反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

進階:
你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題?

python解答思路:遍歷鏈表,選擇頭插法

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

leetcode提交結果:
在這裏插入圖片描述