1:题目描述(力扣)
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
2:解题思路
因为不能改变修改节点内部的值,只能将节点进行交换,所以我们使用虚拟头节点。
第一步:定义一个虚拟头节点,指向链表的头节点;创建一个临时指针pre,指向虚拟头节点。
第二步:只有当pre.next,pre.next.next不为空,才能进行交换,否则就是已经交换完成或者不满足交换的条件。
- 定义一个临时指针cur指向pre.next,定义一个临时指针post指向pre.next.next
- 下面进行交换节点:
将cur的下一个节点指向post的下一个节点
post的下一个节点指向cur
pre的下一个节点指向post
- 将临时指针移动到pre.next.next
第三步:返回链表头节点
代码展示:
# 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):
res = ListNode(next=head) # 创建一个虚拟头节点
pre = res # 定义一个临时指针,指向虚拟头节点
while pre.next and pre.next.next:
cur = pre.next
post = pre.next.next
cur.next = post.next # 将cur的下一个节点指向post的下一个节点
post.next = cur # 将post的下一个节点指向cur
pre.next = post # 将pre的下一个节点指向post
pre = pre.next.next # 将pre指向pre的下一个节点的下一个节点
return res.next # 返回链表的头节点