返回

海贼王路飞的算法宝藏:分隔链表的奇遇

前端

在这个数字世界的汪洋中,算法如一艘艘航船,劈波斩浪,探索未知的领域。路飞,一位算法界的传奇海贼,踏上了分隔链表的冒险之旅。让我们扬起风帆,跟随路飞的脚步,领略这场算法盛宴。

扬帆起航:理解题意

路飞需要分隔一条链表,让所有小于某个值 x 的节点都出现在大于或等于 x 的节点之前。同时,节点的相对位置要保持不变。这就好比把一艘船上的乘客按身高分成两组,矮个子在前,高个子在后,但不能改变他们的前后顺序。

寻宝探险:算法策略

为了完成这个任务,路飞决定采用双指针法。他用一个指针 prev 标记分隔点,用另一个指针 curr 遍历链表。每当 curr 指向一个小于 x 的节点时,路飞就把它插入到 prev 指针之后,从而将小于 x 的节点移动到链表的前半部分。

def partition(head, x):
    prev = ListNode(None)
    prev.next = head
    curr = head

    while curr:
        if curr.val < x:
            # 把小于 x 的节点插入到 prev 指针之后
            temp = prev.next
            prev.next = curr
            curr = curr.next
            prev = prev.next
            temp.next = curr
        else:
            curr = curr.next

    return prev.next

靠岸休整:优化细节

为了让算法更加高效,路飞进一步优化了代码。他将 prev 指针初始指向虚拟头节点,从而简化了插入过程。同时,他使用了哑指针 dummy 来避免特殊情况的处理。

def partition(head, x):
    dummy = ListNode(None)
    dummy.next = head
    prev = dummy
    curr = head

    while curr:
        if curr.val < x:
            # 把小于 x 的节点插入到 prev 指针之后
            next = curr.next
            curr.next = prev.next
            prev.next = curr
            prev = prev.next
            curr = next
        else:
            curr = curr.next

    return dummy.next

胜利返航:SEO优化

为了让路飞的算法宝藏被更多人发现,我们还需要进行 SEO 优化。