24 两两交换链表中的节点
题目24 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
思路
建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。(可以简答理解为,处理某个节点的时候一定要找到该节点的前一个节点,这里为了方便处理头节点)
一定要画图,就看的清晰了!
代码
# 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_head = ListNode(next=head) # 建立虚拟节点
cur = dummy_head
while cur.next != None and cur.next.next != None:
temp1 = cur.next # 保存本来的头节点,因为cur.next就会丢失原先的cur.next节点
temp2 = cur.next.next.next # 保存第二次交换两个节点的前一个节点
cur.next = cur.next.next
cur.next.next = temp1
temp1.next = temp2
cur = cur.next.next
return dummy_head.next # 返回虚拟节点的下一个节点