题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
思路
这里增加了虚拟头节点,为了就是方便,可以将所有的步骤统一起来,不用单独处理头节点的部分了。
首先需要理解,这里的交换是有顺序的,从左往右每两个交换一次。那就会遇到奇偶的情况了,如果节点数(不带虚拟头节点)为偶数,我们正好可以将每两个节点交换一次;如果为奇数,我们最后肯定还剩一个节点,这个节点不用管,他没法再交换了。
我们定义pre和now分别指向相邻的两个节点,初始pre为虚拟头节点,now为head节点。每次交换分成交换和更新指针两步。要注意,我们不仅要将now和now.next进行交换,还要注意将pre的指向也进行相应的修改!
因为head已经改变了,所以最后返回的应该是虚拟头节点的next而不是head!
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def solve(head):
if head==None or head.next==None:
return head
fake_head = ListNode(head)
pre = fake_head
now = head
while now.next:
# 1.交换
tmp = now.next
now.next = now.next.next
tmp.next = now
pre.next = tmp
# 偶数个节点
if now.next==None:
break
# 2.更新pre和now指针
now = now.next
pre = tmp.next
return fake_head.next