1019. 链表中的下一个更大节点

原题链接:

1019. 链表中的下一个更大节点

https://leetcode.cn/problems/next-greater-node-in-linked-list/description/

完成情况:

在这里插入图片描述

解题思路:

class Solution {
// 私有的整型数组result
private int [] result;
// 使用ArrayDeque实现的私有的栈myStack
private final Deque myStack = new ArrayDeque<>();
// 整型变量n

/**
 *
 * @param head
 * @return
 */


}

在这段代码中,定义了一个Solution类,包括一个私有的整型数组result、一个使用ArrayDeque实现的私有的栈myStack、以及一个整型变量n。这段代码还包含了一个注释,用于说明该函数的作用以及参数。

参考代码:

_1019链表中的下一个更大节点_逆向出栈

package leetcode板块;

import java.util.ArrayDeque;
import java.util.Deque;

public class _1019链表中的下一个更大节点_逆向出栈 {
    private class ListNode {
          int val;
          ListNode next;
          ListNode() {}
          ListNode(int val) { this.val = val; }
          ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }
    private  int [] result;
    private final Deque<Integer> myStack = new ArrayDeque<>();
    /**
     *
     * @param head
     * @return head链表中,每一个元素都返回其后面比它大的第一个元素即可。
     */
    public int[] nextLargerNodes(ListNode head) {
        //  TODO  从右往左遍历
        //  反向链入,转化成去最小元素,5   ->   3  5    ->   4比3大,把3剔除掉,栈里面保留  4  5
        findNextSmaller(head,0);
        return result;
    }

    /**
     *
     * @param node
     * @param curSite
     */
    private void findNextSmaller(ListNode node, int curSite) {
        if(node == null){
            result = new int[curSite]; //前面为空是,明确数组长度
            return;
        }
        findNextSmaller(node.next, curSite+1);
        //触底之后,找到前一个更大的元素,如果比当前的栈顶元素更大,就把它踢掉,然后继续往下找
        while (!myStack.isEmpty() && myStack.peek() <= node.val){
            myStack.pop();  //弹出无用数据
        }
        if (!myStack.isEmpty()){
            result[curSite] = myStack.peek();   //栈顶就是第i个节点的下一个更大元素
        }
        myStack.push(node.val);
    }
}

_1019链表中的下一个更大节点_反转链表

package leetcode板块;

import java.util.ArrayDeque;
import java.util.Deque;

public class _1019链表中的下一个更大节点_反转链表 {

    private class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }

    private int [] result;
    private final Deque<Integer> myStack = new ArrayDeque<>();
    private int n;

    /**
     *
     * @param head
     * @return
     */
    public int[] nextLargerNodes(ListNode head){
        head  = reverseList(head);
        //逆向弹出小于当前值的元素,每次读取留在栈顶的元素
        //逆转链表时,会获取到链表的size
        result = new int[n];    //先明确数组长度
        for (ListNode curNode = head; curNode != null; curNode = curNode.next){
            while (!myStack.isEmpty() && myStack.peek() <= curNode.val){
                myStack.pop();  //pass掉比当前数还小的元素
            }
            result[--n] = myStack.isEmpty() ? 0 : myStack.peek();
            myStack.push(curNode.val);  //否则就认为是当前元素,并将之push到栈顶
        }
        return result;
    }

    /**
     *
     * @param head
     * @return
     */
    private ListNode reverseList(ListNode head) {
        ListNode prev = null,cur = head;
        while (cur != null){
            ListNode next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
            ++n;
        }
        return prev;
    }

}

错误经验吸取

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值