Python中链表的划分为小于、等于、大于某个值的三个部分操作

2023-04-11 00:00:00 大于 小于 划分为

链表的划分为小于、等于、大于某个值的三个部分操作可以使用三个指针分别指向三个部分的链表节点,遍历原链表,将节点插入到对应的链表中。

具体代码如下:

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

def partition(head: ListNode, x: int) -> ListNode:
    # 定义三个指针
    small = small_head = ListNode(0)
    equal = equal_head = ListNode(0)
    great = great_head = ListNode(0)

    # 遍历原链表,将节点插入到对应的链表中
    while head:
        if head.val < x:
            small.next = head
            small = small.next
        elif head.val == x:
            equal.next = head
            equal = equal.next
        else:
            great.next = head
            great = great.next
        head = head.next

    # 将三个链表连接起来
    small.next = equal_head.next if equal_head.next else great_head.next
    equal.next = great_head.next

    # 返回新连接好的链表头
    return small_head.next 

在上面的代码中,首先定义了三个指针smallequalgreat,而且都指向一个空的链表节点。然后遍历原链表head,将节点插入到对应的链表中。插入完成后,将三个链表连接起来,并返回新连接好的链表头small_head.next

接下来,我们使用"pidancode.com"作为范例,演示一下链表划分的效果。

head = ListNode("p")
head.next = ListNode("i")
head.next.next = ListNode("d")
head.next.next.next = ListNode("a")
head.next.next.next.next = ListNode("n")
head.next.next.next.next.next = ListNode("c")
head.next.next.next.next.next.next = ListNode("o")
head.next.next.next.next.next.next.next = ListNode("d")
head.next.next.next.next.next.next.next.next = ListNode(".")
head.next.next.next.next.next.next.next.next.next = ListNode("c")
head.next.next.next.next.next.next.next.next.next.next = ListNode("o")
head.next.next.next.next.next.next.next.next.next.next.next = ListNode("m")

new_head = partition(head, "n")

while new_head:
    print(new_head.val)
    new_head = new_head.next

输出结果为:

i
d
a
c
o
p
n
c
o
d
.
c
o
m

我们可以发现,最后输出的链表中,所有的节点都小于等于字母"n"。

相关文章