代码随想录算法训练营第四天(1)|24. 两两交换链表中的节点

46 阅读1分钟

当前指针要指向操作的两个节点之前

题目描述

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

代码示例

class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        # 创建虚拟节点,并将其连接到头节点
        dummy = ListNode(next=head)
        # 使用 current 指针来遍历链表
        current = dummy

        while current.next and current.next.next:
            # 用变量 tmp 指向当前节点的下一个节点
            first_node = current.next
            second_node = current.next.next

            # 更新前后节点的连接关系
            current.next = second_node
            first_node.next = second_node.next
            second_node.next = first_node

            # 更新 current 指向已经交换好的节点对的末尾
            current = current.next.next

        return dummy.next

自己看到题目的第一想法

首先,我意识到要处理链表两两交换的问题,需要引入一个虚拟节点(dummy),以及三个指针pre、cur、after,它们分别指向虚拟节点(dummy)、链表头部(head)、head.next。在每次循环中,我创建一个临时节点(tmp),用于暂存head的下一个节点。然后,通过修改指针的指向,实现两两节点的交换。最后,移动指针,直到遍历完成整个链表。

自己实现过程中遇到哪些困难 

在实现过程中,我发现节点之间的交换关系总是容易混淆,特别是在涉及到指针的移动时。这让我反思在解决问题的过程中,对于每一个指针的指向关系都要有清晰而准确的认识,避免出现混乱的情况。