鏈表:學習單鏈表知識,實踐環形鏈表(142,要求至少兩種方法!)及反轉一個單鏈表(206),不限制語言!
單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。
鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示後繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。
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提交結果: