题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:

输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]内 0 <= Node.val <= 100
思路
交换的过程中其实是三个节点参与了指针的变换
(1)第一个节点.next 要指向第二个节点.next
(2)第二个节点的next 要指向第一个节点
(3)注意此时确实完成了两个节点的交换,但是会出现 ....1->2->3<-4这样的情况,所以需要存一下两个交换节点的前一个节点,将前一个节点.next指向第二个节点,完成.....1->2->4->3
同时,考虑到处理第一对节点交换不存在前一个节点,因此可以创建一个虚拟节点,指向第一个节点
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode(-1) # 定义虚拟节点
dummy.next = head # 指向head
pre = dummy # 存储前一个节点
while head and head.next: # 当交换的两个节点不为空
first = head
second = head.next
pre.next = second # 先改变思路中的(3)的指向
first.next = second.next # 再完成(1)(2)两个节点的交换
second.next = first
pre = first # 更新pre和head,进行下一次的交换
head = pre.next
return dummy.next
706

被折叠的 条评论
为什么被折叠?



