天天看點

【LeetCode】面試算法總結@連結清單1、LeetCode----206. 連結清單翻轉2、LeetCode----24. 兩兩交換連結清單中的節點3、LeetCode----141. 環形連結清單4、LeetCode----142. 環形連結清單 II

面試算法總結:連結清單

  • 1、LeetCode----206. 連結清單翻轉
    • Solution1
    • Solution2
  • 2、LeetCode----24. 兩兩交換連結清單中的節點
    • 基本思路
  • 3、LeetCode----141. 環形連結清單
    • 基本思路
  • 4、LeetCode----142. 環形連結清單 II
    • 基本思路

點選了解基本資料結構

1、LeetCode----206. 連結清單翻轉

https://leetcode-cn.com/problems/reverse-linked-list/

【LeetCode】面試算法總結@連結清單1、LeetCode----206. 連結清單翻轉2、LeetCode----24. 兩兩交換連結清單中的節點3、LeetCode----141. 環形連結清單4、LeetCode----142. 環形連結清單 II

Solution1

#基本思路
#首先将連結清單中的所有的資料讀取存儲到清單中
#然後結合ListNode,将清單的倒序填充到新的建立的連結清單中
#不斷地插入後置節點,并不斷的填充val,直至清單的所有資料填充完畢
class ListNode:
   def __init__(self, x):
       self.val = x
       self.next = None
 
class Solution1:
    def reverseList(self, head: ListNode) -> ListNode:
        answer_val = []
        if not head:
            return head
        while head:
            answer_val.append(head.val)
            head = head.next
        answer_val = answer_val[::-1]
        new_head = ListNode(answer_val[0])
        answer_val.remove(answer_val[0])
        p = new_head
        for i in answer_val:
            temp = ListNode(i)
            p.next = temp
            p = p.next   
        return new_head
           

Solution2

#基本思路
#直接利用連結清單的特性進行構造将連結清單的前驅和後繼互換即可
class Solution2:
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        p, rev = head, None
        while p:
            rev, rev.next, p = p, rev, p.next
        return rev
           

2、LeetCode----24. 兩兩交換連結清單中的節點

https://leetcode-cn.com/problems/swap-nodes-in-pairs/submissions/

【LeetCode】面試算法總結@連結清單1、LeetCode----206. 連結清單翻轉2、LeetCode----24. 兩兩交換連結清單中的節點3、LeetCode----141. 環形連結清單4、LeetCode----142. 環形連結清單 II

基本思路

#利用一個flag值将連結清單區分為奇數和偶數
#對連結清單進行分組,每兩個進行一組
#不斷地交換每一組中的前後兩個資料
#奇數時最後一個元素不進行交換
#Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
 
class Solution:
    def swapPairs(self, head: ListNode) -> ListNode:
        p, v = head, None
        flag = 0
        if not head or not head.next:
            return head
        while p:
            try:
                if not flag % 2:
                    v = p.next
                    p.val, v.val = v.val, p.val
            except:
                pass
            flag += 1
            p = p.next
        return head
           

3、LeetCode----141. 環形連結清單

https://leetcode-cn.com/problems/linked-list-cycle/

【LeetCode】面試算法總結@連結清單1、LeetCode----206. 連結清單翻轉2、LeetCode----24. 兩兩交換連結清單中的節點3、LeetCode----141. 環形連結清單4、LeetCode----142. 環形連結清單 II

基本思路

#利用兩個指針,分别指向連結清單的頭部,兩個指針以不同的速度向前移動
#一個移動一次移動一位,一個一次移動兩位
#最後判斷,如果存在兩個指針的後繼指向同一個節點,那麼說明此為循環連結清單。
#Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None
 
class Solution(object):
    def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        other_head = head
        while head:
            try:
                head = head.next
                other_head = other_head.next.next
                if head.next == other_head.next:
                    return True
            except:
                return False
        return False
           

4、LeetCode----142. 環形連結清單 II

https://leetcode-cn.com/problems/linked-list-cycle-ii/

【LeetCode】面試算法總結@連結清單1、LeetCode----206. 連結清單翻轉2、LeetCode----24. 兩兩交換連結清單中的節點3、LeetCode----141. 環形連結清單4、LeetCode----142. 環形連結清單 II

基本思路

#利用set資料結構的唯一性,将已經通路過的資料存入的set表中
#當出現head在set表中時此時說明此節點為再次出現的節點
#是以這個節點就肯定是我們要找的環形連結清單的起點
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None
 
class Solution(object):
    def detectCycle(self, head):
        set1=set([])
        while head not in set1:
            set1.add(head)
            if not head:
                break
            head=head.next
        return head
           

繼續閱讀