返回
海贼王路飞的算法宝藏:分隔链表的奇遇
前端
2023-11-12 10:50:05
在这个数字世界的汪洋中,算法如一艘艘航船,劈波斩浪,探索未知的领域。路飞,一位算法界的传奇海贼,踏上了分隔链表的冒险之旅。让我们扬起风帆,跟随路飞的脚步,领略这场算法盛宴。
扬帆起航:理解题意
路飞需要分隔一条链表,让所有小于某个值 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 优化。