Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chương trình sắp xếp nút danh sách liên kết dựa trên giá trị k trong Python

Mô tả bài toán

Cho danh sách liên kết đơn và giá trị k. Sắp xếp lại các nút sao cho: nút giá trị < k đứng trước, sau đó là các nút = k, cuối cùng là nút > k. Giữ nguyên thứ tự tương đối của các nút trong mỗi nhóm.

Ví dụ: L = [4,3,6,6,6,10,8], k = 6 → đầu ra [4,3,6,6,6,10,8].

Giải thuật (Phân vùng 3 hướng - 3-way Partition)

  1. Tạo 3 danh sách giả (dummy) cho nhóm <, =, >.
  2. Duyệt qua danh sách gốc, nối từng nút vào nhóm tương ứng.
  3. Nối 3 nhóm lại: less -> equal -> greater.
  4. Trả về đầu của nhóm less.

Ví dụ mã Python

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

def make_list(elements):
    head = ListNode(elements[0])
    for element in elements[1:]:
        ptr = head
        while ptr.next:
            ptr = ptr.next
        ptr.next = ListNode(element)
    return head

def print_list(head):
    ptr = head
    print('[', end="")
    while ptr:
        print(ptr.val, end=", ")
        ptr = ptr.next
    print(']')

class Solution:
    def solve(self, node, k):
        less_head = less = ListNode(0)
        equal_head = equal = ListNode(0)
        greater_head = greater = ListNode(0)
        cur = node
        while cur:
            if cur.val < k:
                less.next = ListNode(cur.val)
                less = less.next
            elif cur.val > k:
                greater.next = ListNode(cur.val)
                greater = greater.next
            else:
                equal.next = ListNode(cur.val)
                equal = equal.next
            cur = cur.next
        less.next = equal_head.next
        equal.next = greater_head.next
        return less_head.next

ob = Solution()
L = make_list([4, 3, 6, 6, 6, 10, 8])
k = 6
print_list(ob.solve(L, k))

Đầu vào

[4, 3, 6, 6, 6, 10, 8], 6

Đầu ra

[4, 3, 6, 6, 6, 10, 8, ]