Leetcode演算法——24、連結串列成對交換
阿新 • • 發佈:2018-12-17
給定一個連結串列,將每兩個相鄰的節點交換位置,最後返回頭結點。
備註: 演算法只能使用常量的空間。 不可以修改節點的值,只能改變節點本身。
示例:
輸入: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())