LeetCode 24. 兩兩交換連結串列中的節點

dunne21發表於2021-09-09

24. 兩兩交換連結串列中的節點


題目來源:

題目


給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

示例:

給定 1->2->3->4, 你應該返回 2->1->4->3.

解題思路


本題中,要求實際的進行節點交換,不僅僅是單純的改變節點內部的值。

在這裡,其實有遞迴跟非遞迴兩種思路,但是核心思想類似,都是要交換相鄰節點的連結串列形態完成整個連結串列的調整。

思路一:遞迴

使用遞迴時,需要明確終止條件,其次,對於完整的呼叫棧先不要急於下手,這樣一層層下來,很容易無從下手。遞迴,主要是不斷重複相同的事情,但遇到終止條件時會層層返回。在這種情形下,可以考慮先關注一層呼叫單元的情況。

在這裡,我們首先要明確的是:終止的條件,返回內容 ,以及當前層呼叫單元具體做了什麼。

接著看本題:

  • 終止條件:就是 head 為空,或者 head.next 為空。這表示連結串列沒有節點,或者只有一個節點,這樣將無法交換,也就是終止條件。
  • 返回內容:返回的是交換完成的子連結串列。
  • 呼叫單元:在這裡 ,設前後節點 front_node, tail_node,對兩個節點進行交換,front_node 連線後面交換完成的子連結串列,tail_node 連線 front_node。

這就是遞迴的思路。

思路二:非遞迴

非遞迴跟遞迴的思路其實是相類似的。

設前後節點 front_node 和 tail_node,核心同樣是交換前後節點,但是要增加輔助節點 pre,記錄 front_node 的前節點。

具體演算法:

  • 定義前後節點 front_node,tail_node;
  • 交換前後節點;
  • 更新 pre.next 指向交換後的頭;
  • 迴圈結束,返回最後的交換結果。

具體的程式碼實現如下。

程式碼實現


遞迴

# 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:
        # 如果連結串列為空,或者只有一個節點,直接返回 head
        if not head or not head.next:
            return head

        # 需交換的前後節點
        front_node = head
        tail_node = head.next

        # 交換節點
        front_node.next = self.swapPairs(tail_node.next)
        tail_node.next = front_node

        return tail_node

非遞迴

# 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:
		# dummy 簡化邊界條件
        dummy = ListNode(-1)
        dummy.next = head

        pre = dummy

        while head and head.next:
            front_node = head
            tail_node = head.next

            # 交換
            pre.next = tail_node
            front_node.next = tail_node.next
            tail_node.next = front_node

            # 重置 pre, head
            pre = front_node
            head = front_node.next
        
        return dummy.next

實現結果


遞迴結果:

圖片描述

非遞迴結果:

圖片描述


以上就是使用遞迴和非遞迴的思路,對連結串列相鄰節點進行交換,解決《兩兩交換連結串列中的節點》問題的主要內容。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1600/viewspace-2825179/,如需轉載,請註明出處,否則將追究法律責任。

相關文章