返回
将单链表中的元素两两交换
前端
2023-10-25 13:14:51
当谈到算法刷题时,链表操作无疑是备受关注的环节之一。它既是对基础数据结构的考察,又涉及到编程技巧的灵活应用。今天,我们就来探讨一道经典的链表题目——两两交换链表中的元素。
问题
给你一个链表,要求将相邻的两个节点进行交换,并返回交换后的链表。需要注意的是,不能仅仅改变节点内部的值,而是需要实际进行节点交换。
解决方案
解决这个问题的关键在于使用三个指针:
- prev: 指向当前节点的前一个节点
- first: 指向要交换的第一个节点
- second: 指向要交换的第二个节点
步骤:
- 将
prev
指向first
的前一个节点(对于头节点,prev
为null
)。 - 将
first
的next
指向second
。 - 将
second
的next
指向prev
。 - 将
prev
指向second
。 - 将
first
指向second
。 - 将
second
指向second
的下一个节点。 - 重复步骤 1-6,直到
second
为null
。
代码示例:
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
总结
两两交换链表中的元素是一种经典的算法问题,涉及到链表的操作和指针的灵活使用。本文提供了一种详细的解决方案,并通过代码示例和复杂度分析帮助读者理解算法的实现。掌握这种算法对于解决类似的链表问题至关重要,有助于提高算法刷题能力。