暴力法:双层遍历循环
//链表中下一个更大值
//采用双层循环:暴力法
//时间复杂度:O(N^2)
public int[] nextLargerNodes(ListNode head) {
if(head==null) return null;
//统计链表中节点的个数
ListNode temp = head;
int size = 0;
while(temp!=null){
size++;
temp=temp.next;
}
//构建返回的数组
int[] rs = new int[size];
//数组中的节点
int index = 0;
temp = head;
ListNode comPare = temp.next;
while(temp!=null){
//在temp节点之后寻找大于它的第一个节点
comPare = temp.next;
//若没找到,则默认值为0不用动
while(comPare!=null){
//在其之后寻找第一个大于它的节点
if(comPare.val>temp.val){
rs[index]=comPare.val;
break;//不再继续查找
}else{
//没找到继续查找
comPare =comPare.next;
}
}
//应该在这里更新返回数组中元素的索引
index++;
temp=temp.next;
}
return rs;
}
使用栈:单调栈(这种思想是在)
//栈中保存链表的节点编号(即下标),还需要一个data数组保存下标对应的链表值(避免再次遍历链表)
//按单调递减栈的入栈顺序,如果当前遍历到的节点比栈顶值大,说明需要将占据中元素出栈,并更新
//栈中保存链表的节点编号(即下标),还需要一个data数组保存下标对应的链表值(避免再次遍历链表)
//按单调递减栈的入栈顺序,如果当前遍历到的节点比栈顶值大,说明需要将占据中元素出栈,并更新
public int[] nextLargerNodes1(ListNode head){
//
int[] arr = new int[10000];
int[] valueArr = new int[10000];
//定义栈
Stack<Integer> stack = new Stack<>();
int length = 0;
int value;
while (head != null) {
//求链表当前节点的值
value = head.val;
//将当前节点的值保存
valueArr[length] = value;
//栈不为空并且当前节点的值大于栈顶元素
//栈里保存了节点的下标 ,valueArray保存了节点对应的值
//假如当前节点的值大于之前节点的值则把之前
while (!stack.isEmpty() && value > valueArr[stack.peek()]) {
//arr保存最终的结果 stack保存了遍历节点的下标
arr[stack.pop()] = value;
}
//栈中保存链表节点的编号
stack.add(length);
//遍历下一个节点
length++;
//
head = head.next;
}
int[] result = new int[length];
for (int i = 0; i < length; i++) {
result[i] = arr[i];
}
return result;
}