代码随想录之链表——两两交换链表中的节点

39 阅读1分钟

题目

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

image.png

总结:先将所需的节点单独取出,再将其按所需连接,最后与链表剩下部分进行连接以及遍历。

思路分析

  1. 每次交换必须有两个节点:这意味着只有当precur节点存在时,我们才能进行交换。
  2. 虚拟头节点的引入:为了简化链表头部的交换,我们引入一个虚拟头节点res,它指向链表的实际头节点。这样可以避免处理链表头部的特殊情况。(res -> 1 -> 2 -> 3 -> 4)
  3. 定义交换过程: 交换的核心思想是将每一对相邻的节点进行反转。
    • 通过pre指针,保存当前交换前的节点,以及两个节点后一个节点t。

    • 保存当前要交换的两个节点(curpost)。

    • 交换这两个节点的位置,更新它们的next指向正确的位置。

    • 记录并更新pre指针,以便在下一轮继续交换。 image.png

  4. 更新pre指针: 每次交换完一对节点后,我们需要更新pre指针,指向刚才交换后的第二个节点(即原post节点)。然后进入下一轮交换。

Python代码实现

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def swapPairs(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        res=ListNode(next=head)
        pre=res
        while pre.next and pre.next.next:
            cur,post=pre.next,pre.next.next
            t=post.next
            pre.next=post
            post.next=cur
            cur.next=t

            pre=pre.next.next
        return res.next