📌  相关文章
📜  围绕给定值对链表进行分区并保持原始顺序(1)

📅  最后修改于: 2023-12-03 14:50:45.537000             🧑  作者: Mango

围绕给定值对链表进行分区并保持原始顺序

在进行链表操作时,有时需要围绕给定的值对链表进行分区,并且还需要维持分区后的元素在原始的顺序上。这个问题在实际编程中经常遇到,下面我们来介绍一下如何解决这个问题。

问题描述

假设有一个链表如下所示:

1 -> 4 -> 3 -> 2 -> 5 -> 2

现在,需要围绕给定的值x对这个链表进行分区,使得小于x的节点全部位于大于等于x的节点之前,并且需要保持原始顺序,即上面的例子分区后的链表应该是下面这个样子:

1 -> 4 -> 3 -> 2 -> 2 -> 5
解决方案

我们可以使用双指针来解决这个问题。具体步骤如下:

  1. 定义两个指针left和right,分别指向链表的头结点和尾结点。
  2. 从左往右遍历链表,如果当前节点的值小于x,则将它和left指向的节点交换,然后将left指针向右移动一个位置。
  3. 从右往左遍历链表,如果当前节点的值大于等于x,则将它和right指向的节点交换,然后将right指针向左移动一个位置。
  4. 重复第2步和第3步,直到left和right指针相遇。

下面是Python代码实现:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def partition(head: ListNode, x: int) -> ListNode:
    # 定义左右指针
    left, right = ListNode(0), ListNode(0)
    left_head, right_head = left, right
    
    # 遍历链表
    curr = head
    while curr:
        if curr.val < x:
            left.next = curr
            left = left.next
        else:
            right.next = curr
            right = right.next
        curr = curr.next
    
    # 合并链表
    right.next = None
    left.next = right_head.next
    
    return left_head.next

上面的代码中,我们使用了Python语言的特性来简化代码,比如使用了语言自带的类型注释和函数参数注解。同时,我们还使用了单向链表来实现链表结构,方便进行遍历和指针操作。

另外,我们使用了两个虚节点left和right来作为左右指针的起点,避免了对头节点和尾节点的特殊处理。具体的实现方式为,使用left和right节点分别表示小于和大于等于x的节点,分别存储在left.next和right.next中,最后再将它们合并起来。

总结

本文介绍了如何围绕给定值对链表进行分区并保持原始顺序。我们使用了双指针来解决这个问题,同时还使用了Python语言的一些特性来简化代码实现。学习了本文的内容后,读者应该能够掌握这个问题的解决方法,进一步提升自己的编程技能。