1.题目

2.思路
(1)栈中存的元素:每个元素是 int[]{节点值, 节点下标},比如 {2, 0} 表示:
这个节点的值 = 2
它在结果数组中的位置 = 0
new int[]{cur.val, cnt}
··············
res 是"答案列表",按链表顺序存每个节点的【下一个更大节点的值】。
先假设它没有更大值,预填 0

(2)从栈底到栈顶,节点值是单调递减的。
遍历到一个新节点 cur 时,如果 cur.val 比栈顶的小或相等,那它也"没有更大值",先压栈。
一旦 cur.val 比栈顶的大,就说明:
对栈顶那个节点来说,当前的 cur.val 就是它"后面第一个更大的值",
那就把栈顶弹出,同时在结果数组对应位置写上 cur.val。
(3)遍历完链表后:
栈里剩下的节点就说明后面再也没更大的了,
你之前已经 res.add(0) 预填了 0,直接保留就行。




3.代码实现
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public int[] nextLargerNodes(ListNode head) {
List<Integer> res=new ArrayList<>();
Deque<int[]> st=new ArrayDeque<int[]>();
ListNode cur=head;
int cnt=-1;
while(cur!=null)
{
cnt++;
res.add(0);//如果没找到比当前元素更大的元素返回0
//当栈不空,且取出栈顶数组的第一个元素
while(!st.isEmpty()&&st.peek()[0]<cur.val)
{
res.set(st.pop()[1],cur.val);
}
st.push(new int[]{cur.val,cnt});
cur=cur.next;
}
//将列表转换成数组
int size=res.size();
int[] arr=new int[size];
for(int i=0;i<size;i++)
{
arr[i]=res.get(i);
}
return arr;
}
}