1. 程式人生 > >19.兩兩交換連結串列中的節點-Leetcode 024(python)

19.兩兩交換連結串列中的節點-Leetcode 024(python)

  • 題目描述

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

  • 示例

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

你的演算法只能使用常數的額外空間。 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

  • 解決方案

定義指標first和second,分別指向要交換的兩個節點,交換之後second在first的前面

為了方便操作,在頭結點之前加上一個extr節點

另外有一個節點始終指向要交換的兩個節點的前驅節點

  • 程式碼
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        #定義了一個前驅節點但是暫時沒有指向頭
        extr = ListNode(0)

        #如果連結串列為空,直接返回None
        if head is None:
            return None
        # pre.next = head
        #用first和second分別指向需要交換的兩個節點
        pre = extr
        first = head
        second = head.next
        
        #如果第二個節點為空,直接返回第一個節點
        #因為在接下來的while迴圈裡,並沒有針對這種情況作出處理
        if second is None:
            return head
        #判斷要當前要交換的第二個節點是否為空
        while  second:
            #交換節點的值
            pre.next = second
            first.next = second.next
            second.next = first
            #pre節點前移,移到往後兩個節點的前一個節點處
            pre = first 
            #調整first和second指向下一次要交換的兩個節點
            first = first.next
            #要注意判斷此時的first是否已經是空
            if first:
                second = first.next
            else:
                second = None
        return extr.next