📌  相关文章
📜  在链接列表中将每个节点替换为其“超越者计数”(1)

📅  最后修改于: 2023-12-03 15:23:38.166000             🧑  作者: Mango

在链接列表中将每个节点替换为其“超越者计数”

有一个链接列表,需要将每个节点替换为其“超越者计数”,即链中比当前节点的值大的节点数量。

例如,给定以下链接列表:

2 -> 5 -> 3 -> 7 -> 8 -> 1 -> 9

每个节点的“超越者计数”如下所示:

2(0) -> 5(1) -> 3(1) -> 7(2) -> 8(3) -> 1(0) -> 9(1)

这里是一种实现“超越者计数”的算法:

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

def countSmaller (head: ListNode) -> List[int]:
    # 统计长度
    n = 0
    p = head
    while p:
        n += 1
        p = p.next

    # 辅助数组
    ans = [0] * n

    # 逆序遍历链表
    stack = []
    p = head
    i = n - 1
    while p:
        while stack and stack[-1] < p.val:
            stack.pop()
            ans[i] += 1
            i -= 1
        stack.append(p.val)
        p = p.next
        i -= 1

    return ans

这个算法的时间复杂度是 O(n),其中 n 是链表的长度。

如果要将链表中的每个节点替换为其“超越者计数”,可以使用以下代码:

def replaceNodes (head: ListNode) -> ListNode:
    counts = countSmaller(head)
    p = head
    i = 0
    while p:
        p.val = counts[i]
        p = p.next
        i += 1

    return head

这里使用了 countSmaller 函数来计算“超越者计数”,然后遍历链表将每个节点的值替换为其“超越者计数”。

如果输入的链表是 2 -> 5 -> 3 -> 7 -> 8 -> 1 -> 9,则输出的链表应该是 0 -> 1 -> 1 -> 2 -> 3 -> 0 -> 1