你绝对不知道的java栈stack小细节

本文记录了在LeetCode上遇到的一个问题,涉及链表操作和栈的应用。在尝试从尾到头逆序返回链表节点值时,由于使用了同步的`size()`方法导致最后一个元素无法正确获取。解决方案是先获取栈的大小,然后在循环中依次弹出节点值。通过修改代码,成功解决了这个问题,实现了预期的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天刷leetcode的时候发现一个问题:
题目:

//输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 
//
// 
//
// 示例 1: 
//
// 输入:head = [1,3,2]
//输出:[2,3,1] 

我写的答案:

class Solution {
    public int[] reversePrint(ListNode head) {
        Stack<ListNode> stack = new Stack<ListNode>();
        while (head != null) {
            stack.push(head);
            head = head.next;
        }
        int[] print = new int[stack.size()];
        for (int i = 0; i < stack.size(); i++) {
            print[i] = stack.pop().val;
        }
        return print;
    }
}

运行结果:

info
			运行成功:
			测试用例:[1,3,2]
			测试结果:[2,3,0]
			期望结果:[2,3,1]
			stdout:

为什么最后一个数是零呢?
点进size()方法一看:

 public synchronized int size() {
        return elementCount;
    }

好家伙!!有个锁:synchronized
这就导致了最后一个数弹不出来
解决方法:

  int size = stack.size();
        int[] print = new int[size];
        for (int i = 0; i < size; i++) {
            print[i] = stack.pop().val;
        }

提前拿出长度,结果:

info
			运行成功:
			测试用例:[1,3,2]
			测试结果:[2,3,1]
			期望结果:[2,3,1]
			stdout:
			

这样就可以啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掉头发的王富贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值