思路:
创建虚拟头节点指向head
创建指针指cur向虚拟头节点,遍历链表。
注意循环条件的终止。如果是奇数节点,则cur.next.next为空,如果偶数节点,则cur.next为空
接下来做指向操作,当cur.next = cur.next.next时,当虚拟头节点指向节点二时,此时找不到节点一的路径,所以在改变指向时,先创建临时指针tmp保存节点一的路径。
在改变指向时任然可以找到节点一的路径,在改变节点二的指向之前,创建tmp1保存节点三的路径,这样在改变节点2的路径时接下来任然可以找到节点三的路径。
最后cur指针向后移动两个节点
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
dummy_head = ListNode(next=head)
current = dummy_head
# 必须有cur的下一个和下下个才能交换,否则说明已经交换结束了
while current.next and current.next.next:
#将节点保存
temp = current.next # 防止节点修改
temp1 = current.next.next.next
#将第二个节点指向第一给节点,因为创建了虚拟头节点,所以currnet.next.next是第二个节点,currnet是原来的头节点
current.next = current.next.next
#temp是原来保存的节点一,
current.next.next = temp
#节点一指向节点三
temp.next = temp1
#指针向后移动两个节点
current = current.next.next
return dummy_head.next