a. 迭代版本。定义奇数结点的前驱结点、奇数结点、偶数结点,每次迭代都让前驱结点指向偶数结点,再让奇数结点指向下一个偶数结点,最后让偶数结点指向奇数结点。
b. 递归版本。定义偶数结点、奇数结点,结点内让奇数结点指向下一个结点,再让偶数结点指向奇数结点,返回偶数结点。
迭代法
- while cur and cur.next: 一定要检查是否可能出现 None.next 的情况
- 考虑特殊测试用例,比如 链表为空 以及 链表只有一个结点,链表只有两个结点,
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def swapPairs(self, head):
dummy = ListNode(-1)
dummy.next = head
pre, cur = dummy, head
while cur and cur.next:
## 交换链表需要保存:前一个,结点1,结点2,后一个(后面将暂时与结点1相连)
## 这里简化为3个变量,即,前一个,结点1,结点2
nex = cur.next
## 两个结点交换
pre.next = nex
cur.next = nex.next
nex.next = cur
## 更新pre和cur
pre, cur = cur, cur.next
return dummy.next
递归法
def swapPairs(self, head: ListNode) -> ListNode:
# If the list has no node or has only one node left.
if not head or not head.next:
return head
# Nodes to be swapped
first, second = head, head.next
# Swapping
first.next = self.swapPairs(second.next)
second.next = first
# Now the head is the second node
return second