返回
算法实战:玩转两两交换链表中的节点
前端
2024-02-27 13:03:41
之前,我们探索了一道算法题,要求每隔K个节点交换一次链表中的节点。而今天,我们来玩点更简单的,在原有的基础上,把K换成了2,也就是两两交换链表中的节点 。
乍一看,这道题似乎比之前的更容易,但别小看这小小的变化,它对解题方法和复杂度的影响可大着呢!准备好了吗?让我们深入算法的海洋,一起揭开两两交换链表奥秘!
先来复习一下之前的解法:为了每隔K个节点交换一次,我们需要使用额外的空间来存储待交换的节点,这使得时间复杂度和空间复杂度都达到了O(n)。
而两两交换就简单多了,我们只需要一个指针 就可以搞定。具体步骤如下:
- 设置三个指针:
prev
、curr
和next
,分别指向当前节点的前一个节点、当前节点和当前节点的下一个节点。 - 对于当前节点
curr
,将curr
的next
指向prev
,也就是让curr
指向它的前一个节点。 - 将
prev
的next
指向next
,也就是让prev
指向curr
的下一个节点。 - 将
curr
和prev
指针向后移动一位,继续执行步骤2和3,直到遍历完整个链表。
这样一来,时间复杂度和空间复杂度都降到了O(n) ,效率大大提升。
为了更好地理解,我们举个例子:
# 定义链表节点类
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):
dummy = ListNode(0) # 虚拟头节点
dummy.next = head
prev = dummy
curr = head
while curr and curr.next:
next = curr.next
curr.next = next.next
next.next = curr
prev.next = next
prev = curr
curr = curr.next
return dummy.next
在上面的示例中,我们创建了一个链表,然后使用swapPairs
函数对其进行两两交换。交换后的链表为:
2 -> 1 -> 4 -> 3
是不是很简单?两两交换算法不仅高效,而且代码简洁明了。
通过这道算法题,我们不仅掌握了一项新的算法技能,还深刻体会到算法的优化之道。在看似简单的题目中,通过巧妙的改进,可以大幅提升算法的性能。
下次遇到算法问题时,不妨多思考一下,看看有没有更简便、更高效的解法。算法的世界,永远充满了挑战和乐趣,让我们继续探索吧!