返回

将单链表中的元素两两交换

前端

当谈到算法刷题时,链表操作无疑是备受关注的环节之一。它既是对基础数据结构的考察,又涉及到编程技巧的灵活应用。今天,我们就来探讨一道经典的链表题目——两两交换链表中的元素。

问题

给你一个链表,要求将相邻的两个节点进行交换,并返回交换后的链表。需要注意的是,不能仅仅改变节点内部的值,而是需要实际进行节点交换。

解决方案

解决这个问题的关键在于使用三个指针:

  • prev: 指向当前节点的前一个节点
  • first: 指向要交换的第一个节点
  • second: 指向要交换的第二个节点

步骤:

  1. prev 指向 first 的前一个节点(对于头节点,prevnull)。
  2. firstnext 指向 second
  3. secondnext 指向 prev
  4. prev 指向 second
  5. first 指向 second
  6. second 指向 second 的下一个节点。
  7. 重复步骤 1-6,直到 secondnull

代码示例:

def swap_pairs(head):
    """
    :type head: ListNode
    :rtype: ListNode
    """
    prev = None
    first = head
    second = head.next

    while second is not None:
        # 交换 first 和 second 节点
        if prev is not None:
            prev.next = second
        first.next = second.next
        second.next = first

        # 更新指针
        prev = first
        first = first.next
        second = second.next

    return head

复杂度分析

  • 时间复杂度: O(n),其中 n 是链表的长度。需要遍历整个链表,因此时间复杂度为 O(n)。
  • 空间复杂度: O(1),因为不需要额外的空间来存储中间结果。

实例

输入: 1 -> 2 -> 3 -> 4 -> 5
输出: 2 -> 1 -> 4 -> 3 -> 5

输入: 1 -> 2 -> 3 -> 4
输出: 2 -> 1 -> 4 -> 3

总结

两两交换链表中的元素是一种经典的算法问题,涉及到链表的操作和指针的灵活使用。本文提供了一种详细的解决方案,并通过代码示例和复杂度分析帮助读者理解算法的实现。掌握这种算法对于解决类似的链表问题至关重要,有助于提高算法刷题能力。