美文网首页
1019. 链表中的下一个更大结点(Python)

1019. 链表中的下一个更大结点(Python)

作者: 玖月晴 | 来源:发表于2021-05-19 14:37 被阅读0次

难度:★★★☆☆
类型:数组
方法:单调栈

题目

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

给出一个以头节点 head 作为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, ... 。

每个节点都可能有下一个更大值(next larger value):对于 node_i,如果其 next_larger(node_i) 是 node_j.val,那么就有 j > i 且 node_j.val > node_i.val,而 j 是可能的选项中最小的那个。如果不存在这样的 j,那么下一个更大值为 0 。

返回整数答案数组 answer,其中 answer[i] = next_larger(node_{i+1}) 。

注意:在下面的示例中,诸如 [2,1,5] 这样的输入(不是输出)是链表的序列化表示,其头节点的值为 2,第二个节点值为 1,第三个节点值为 5 。

示例 1:

输入:[2,1,5]
输出:[5,5,0]

示例 2:

输入:[2,7,4,3,5]
输出:[7,0,5,5,0]

示例 3:

输入:[1,7,5,1,9,2,5,1]
输出:[7,9,9,9,0,5,0,0]

提示:

对于链表中的每个节点,1 <= node.val <= 10^9
给定列表的长度在 [0, 10000] 范围内

解答

关于单调栈,有下面几点需要注意:

第一,单调栈一般用来解决列表中每个元素的下一个更大元素或更小元素的求解问题,比如说这道题;
第二,单调栈中元素从栈底到栈顶是单调递增或递减;
第三,单调栈是需要维护的,随着遍历过程动态更新的,以此来保持栈中元素的单调性。

对于这道题,我们需要准备一个单调栈,从栈底到栈顶保持非递增状态(也就是相邻元素递减或相等),由于需要位置信息用以更新结果列表中对应位置,我们的栈中的每个元素,实际上不仅仅是一个数值,而是数值以及该数值对应的位置,此外,链表只是个幌子,跟列表类似,我们需要准备一个变量loc,用来记录当前遍历到的位置,并准备结果列表res,用来保存结果,我们可以这样理解,对于res中的每个位置,都表达了该位置的结点最崇拜的偶像。

使用while循环进行遍历,每轮循环我们只研究一个结点,着重进行以下操作。

根据当前结点的值更新单调栈,这一步通过while来实现。我们的目的是,要把所有小于当前结点值head.val的元素从栈里按照顺序赶出来,将这些结点node对应位置处的值res[node.location]更新为当前结点值head.val,相当于当前结点head登上他们的榜首,替换掉原来的,成为他们的新偶像。

此外就是一些更新的操作了,要更新的变量有,位置变量loc,下一个结点head,结果列表res以及当前的单调栈。

class Node:
    def __init__(self, val, loc):
        self.value = val
        self.location = loc


class Solution:
    def nextLargerNodes(self, head):
        stack = []
        loc = 0
        res = []
        while head:
            while stack and head.val > stack[-1].value:
                node = stack.pop()
                res[node.location] = head.val
            stack.append(Node(val=head.val, loc=loc))
            res.append(0)
            head = head.next
            loc += 1
        return res

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

相关文章

  • 1019. 链表中的下一个更大结点(Python)

    难度:★★★☆☆类型:数组方法:单调栈 题目 力扣链接请移步本题传送门[https://leetcode-cn.c...

  • 数据结构-python

    链表 链表的结点内容: 数据域 指针域(存储下一个结点的地址) 操作链表时所需: ...

  • Redis中的链表

    链表/结点/迭代器结构体 链表迭代器 通过迭代器获取链表中下一个结点 迭代整个链表

  • 关于链表的预备知识

    定义结点 创建链表结点 连接链表各结点 打印链表结点的值 打印整个链表中的值 删除整个链表 在链表尾部加入结点 特...

  • Java 数据结构 双向链表

    Java 数据结构 双向链表 基本特点 单向链表:只有指向下一个结点的引用(后驱)双向链表:既有指向下一个结点的引...

  • 复杂链表的复制

    题目描述:有一个复杂链表,其结点除了有一个Next指针指向下一个结点外,还有一个random指向链表中的任意结点或...

  • 单链表实现稀疏多项式所有函数

    原文链接 单链表 单链表是由一个个结点构成的,上一个结点指向下一个结点的位置。与顺序表不同,单链表的结点除了存储数...

  • 双向链表python实现

    python 双向链表实现 双向链表实现 链表头部添加 链表尾部添加 插入 删除 查询结点

  • 二叉树

    链表详解 用链表概念辅助理解二叉树,链表一个结点的后区指向下一个链表结点,前区指向上一个链表结点,线性结构。二叉树...

  • 数据结构(C语言)-链表

    一.创建链表 1.定义结点,包括数据域和指针域(存放指向下一个结点的地址) 2.创建链表,即创建一个头结点表示链表...

网友评论

      本文标题:1019. 链表中的下一个更大结点(Python)

      本文链接:https://www.haomeiwen.com/subject/osnlhltx.html