1. 程式人生 > >Leetcode演算法——24、連結串列成對交換

Leetcode演算法——24、連結串列成對交換

給定一個連結串列,將每兩個相鄰的節點交換位置,最後返回頭結點。

備註: 演算法只能使用常量的空間。 不可以修改節點的值,只能改變節點本身。

示例:

輸入:1->2->3->4
輸出:2->1->4->3

思路

連結串列中某兩個相鄰節點 p1 和 p2 互換位置,這是連結串列的基本操作之一。

比如有一個連結串列 p1 -> p2 -> p3 -> p4,想要交換 p2 和 p3 的位置,則:

1、將 p3懸掛起來,將 p2 直接指向 p4,得到 p1 -> p2 -> p4 2、將 p1指向 p3,得到 p1 -> p3, p2 -> p4 3、將 p3 指向 p2,得到 p1 -> p3 -> p2 -> p4

這樣,就實現了 p2 和 p3 的互換。

本題需要每兩個相鄰的元素都要互換,因此需要新增一個迴圈掃描所有節點,每兩個節點交換一次。

python實現

class ListNode:
    def __init__(self, x):
        
        if isinstance(x, list):
            self.val = x[0]
            self.next = None
            head = self
            for i in range(1, len(x)):
                head.
next = ListNode(x[i]) head = head.next else: self.val = x self.next = None def output(self): ''' 輸出連結串列 ''' result = str(self.val) head = self.next while(head is not None): result +=
f' -> {head.val}' head = head.next return '(' + result + ')' def swapPairs(head): """ :type head: ListNode :rtype: ListNode """ head2 = ListNode(0) head2.next = head p = head2 while(p and p.next and p.next.next): p2 = p.next p3 = p2.next p2.next = p3.next p.next = p3 p3.next = p2 p = p2 return head2.next if '__main__' == __name__: head = ListNode([1]) print(swapPairs(head).output())