链表结构中栈的工作原理及代码中push、pop方法疑问
嘿,我来帮你把这两个方法的逻辑掰明白,核心都是围绕栈**后进先出(LIFO)**的特性来的,咱们一步步拆解:
一、先搞懂push方法的逻辑
先看你给出的push代码:
public void push(int v) { Node temp = new Node(); temp.setValue(v); temp.setNext(top); top = temp; }
我们得先明确:top变量始终指向当前栈的最顶部节点(也就是最后入栈的元素)。
第一步
temp.setNext(top):
当你新建一个节点temp存要入栈的值时,得先把这个新节点的「下一个指针」指向当前的栈顶节点(也就是还没入栈前,栈里最上面的那个元素)。这么做是为了让新节点和原来的栈链起来——新节点在最上面,原来的栈顶变成它的下家。第二步
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
相关产品推荐
相关产品推荐

