用Python交换链表中的节点的程序
链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。在某些场景下,我们需要交换链表中相邻的节点,比如将 (A -> B -> C -> D)
变为 (B -> A -> D -> C)
。
下面,我们将展示如何使用 Python 交换链表中的相邻节点,本文将会逐步引导您完成这个过程。
第一步:定义链表节点
在我们开始实现具体的算法之前,我们需要声明一个链表节点类,链表节点类至少要包含数据和指向下一个节点的引用两个属性。下面的代码为我们展示了如何定义链表节点类:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
第二步:构建链表
在实现链表相关算法时,我们需要先构建出一个链表对象。下面的代码展示了如何构建一个简单的链表对象 1 -> 2 -> 3 -> 4
:
# 构建链表
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
第三步:交换相邻节点
经过前两步操作,我们构建了一个简单的链表。现在,我们可以开始交换链表中的相邻节点了。下面的代码演示了如何交换相邻节点:
# 交换相邻节点
def swapPairs(head: ListNode) -> ListNode:
dummy = ListNode(0)
dummy.next = head
pre = dummy
while pre.next and pre.next.next:
a = pre.next
b = a.next
pre.next, a.next, b.next = b, b.next, a
pre = a
return dummy.next
new_head = swapPairs(head)
以上代码解释:
- 维护一个虚拟头节点
dummy
以处理头节点的交换 - 定义前置节点
pre
以方便相邻节点交换,初始值为虚拟头节点 - 当链表中至少存在两个节点时,交换前置节点后继节点的后继节点
- 最后返回头节点引用
完整代码
下面给出完整代码:
# 定义链表节点类
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
# 构建链表
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
# 交换相邻节点
def swapPairs(head: ListNode) -> ListNode:
dummy = ListNode(0)
dummy.next = head
pre = dummy
while pre.next and pre.next.next:
a = pre.next
b = a.next
pre.next, a.next, b.next = b, b.next, a
pre = a
return dummy.next
# 测试代码
new_head = swapPairs(head)
# 输出交换后的链表
while new_head:
print(new_head.val, end=' -> ')
new_head = new_head.next
当运行此代码时,我们将得到如下输出:
2 -> 1 -> 4 -> 3 ->
结论
本文演示了如何使用 Python 交换链表中的相邻节点。上述代码充分展示了 Python 在链表处理方面的优势,既简单又易于理解。如果你对链表操作有任何疑问,可以参考上述代码加以实践。