You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链表结构中栈的工作原理及代码中push、pop方法疑问

嘿,我来帮你把这两个方法的逻辑掰明白,核心都是围绕栈**后进先出(LIFO)**的特性来的,咱们一步步拆解:

一、先搞懂push方法的逻辑

先看你给出的push代码:

public void push(int v) {
    Node temp = new Node();
    temp.setValue(v);
    temp.setNext(top);
    top = temp;
}

我们得先明确:top变量始终指向当前栈的最顶部节点(也就是最后入栈的元素)。

  1. 第一步temp.setNext(top):
    当你新建一个节点temp存要入栈的值时,得先把这个新节点的「下一个指针」指向当前的栈顶节点(也就是还没入栈前,栈里最上面的那个元素)。这么做是为了让新节点和原来的栈链起来——新节点在最上面,原来的栈顶变成它的下家。

  2. 第二步top = temp:
    把top指针更新为新创建的temp节点,这样top就指向了新的栈顶,符合“新入栈的元素在最顶部”的规则。

举个简单例子:

  • 初始状态:top = null(空栈)
  • 第一次push值1:temp的next指向null,然后top变成这个temp,现在栈是top → Node(1) → null
  • 第二次push值2:temp的next指向Node(1),然后top变成这个temp,现在栈是top → Node(2) → Node(1) → null
    这样每次新元素都在最前面,完全符合栈的后进先出。

二、再解释pop方法里top.getNext()的疑问

虽然你没贴pop的完整代码,但常规栈的pop实现大概是这样的:

public int pop() {
    if (top == null) {
        throw new EmptyStackException();
    }
    int value = top.getValue();
    top = top.getNext(); // 这里就是你问的点
    return value;
}

为什么top.getNext()会返回前一个节点?
其实每个节点的next指针,保存的是它下面的那个节点(也就是比它更早入栈的元素)。比如刚才的栈top → Node(2) → Node(1) → null,Node(2)的next指向的就是Node(1)——也就是在Node(2)入栈之前的栈顶节点。

当你执行pop时,要把栈顶元素移除,所以需要让top指向原来栈顶的下一个节点(也就是Node(1)),这样Node(1)就变成了新的栈顶,这就是“前一个节点”的由来。

附上你提供的代码(完整片段)

public class Stack {
    private Node top;

    public Stack() {
        top = null;
    }

    public void push(int v) {
        Node temp = new Node();
        temp.setValue(v);
        temp.setNext(top);
        top = temp;
    }

    public int peek() {
        return top.getValue();
        // 这里应该还有空栈判断的逻辑,避免空指针
    }
}

内容的提问来源于stack exchange,提问作者julianrios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:23:07