欢迎来到本教程的一篇新文章,今天我们将学习如何解决LeetCode中的问题24——"两两交换链表中的节点"。这个问题要求我们交换链表中每两个相邻的节点,并返回新链表的头部。通过学习如何使用递归和迭代两种方法来解决这个问题,你将提高你的链表处理和算法设计能力。
问题描述
题目描述如下:
给定一个链表,交换每两个相邻的节点并返回其头部。
示例:
假设我们有一个链表 1 → 2 → 3 → 4
,交换相邻节点后变成 2 → 1 → 4 → 3
。
解决思路
要解决这个问题,我们可以采用两种方法:递归和迭代。
递归方法:
-
基本情况:如果链表为空或者只有一个节点,无需交换,直接返回头部。
-
对于剩余的链表,我们交换前两个节点,然后递归处理剩余的链表。
-
最后,将交换后的子链表连接到原始链表上。
迭代方法:
-
创建一个虚拟节点
dummy
,将其指向原始链表的头部。 -
使用指针
prev
指向dummy
,然后遍历链表。 -
对于每两个相邻的节点,交换它们的位置。
-
更新
prev
指针,继续遍历。 -
返回交换后的链表的头部。
Python代码实现
下面是使用Python实现的解决方案代码:
递归方法:
class ListNode:
def __init__(self, value=0, next=None):
self.value = value
self.next = next
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
# 基本情况:链表为空或只有一个节点
if not head or not head.next:
return head
# 交换前两个节点
first_node = head
second_node = head.next
first_node.next = self.swapPairs(second_node.next)
second_node.next = first_node
return second_node
迭代方法:
class ListNode:
def __init__(self, value=0, next=None):
self.value = value
self.next = next
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
# 创建虚拟节点
dummy = ListNode(0)
dummy.next = head
prev = dummy
while head and head.next:
# 交换相邻的两个节点
first_node = head
second_node = head.next
prev.next = second_node
first_node.next = second_node.next
second_node.next = first_node
# 更新prev和head指针
prev = first_node
head = first_node.next
return dummy.next
示例
现在让我们看一个示例,演示如何使用这两种方法来交换链表中的节点:
# 创建一个链表
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
# 交换链表中的节点
solution = Solution()
new_head = solution.swapPairs(head)
# 打印交换后的链表
current = new_head
while current:
print(current.value, end=" → ")
current = current.next
结论
通过这篇教程,我们学习了如何解决LeetCode问题24——"两两交换链表中的节点",并提供了使用递归和迭代两种方法的Python代码示例。希望这个教程帮助你理解如何交换链表中每两个相邻的节点。在接下来的教程中,我们将继续学习更多有关数据结构和算法的知识。感谢阅读!