返回

算法实战:玩转两两交换链表中的节点

前端

之前,我们探索了一道算法题,要求每隔K个节点交换一次链表中的节点。而今天,我们来玩点更简单的,在原有的基础上,把K换成了2,也就是两两交换链表中的节点

乍一看,这道题似乎比之前的更容易,但别小看这小小的变化,它对解题方法和复杂度的影响可大着呢!准备好了吗?让我们深入算法的海洋,一起揭开两两交换链表奥秘!

先来复习一下之前的解法:为了每隔K个节点交换一次,我们需要使用额外的空间来存储待交换的节点,这使得时间复杂度和空间复杂度都达到了O(n)。

而两两交换就简单多了,我们只需要一个指针 就可以搞定。具体步骤如下:

  1. 设置三个指针:prevcurrnext,分别指向当前节点的前一个节点、当前节点和当前节点的下一个节点。
  2. 对于当前节点curr,将currnext指向prev,也就是让curr指向它的前一个节点。
  3. prevnext指向next,也就是让prev指向curr的下一个节点。
  4. currprev指针向后移动一位,继续执行步骤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

是不是很简单?两两交换算法不仅高效,而且代码简洁明了。

通过这道算法题,我们不仅掌握了一项新的算法技能,还深刻体会到算法的优化之道。在看似简单的题目中,通过巧妙的改进,可以大幅提升算法的性能。

下次遇到算法问题时,不妨多思考一下,看看有没有更简便、更高效的解法。算法的世界,永远充满了挑战和乐趣,让我们继续探索吧!