练习实现堆栈,需要帮助理解一个奇怪的行为
Practicing implementing a stack, need help understanding a strange behavior
我正在练习在 java 中为我的 compsci class 实现堆栈,这是我拥有的:
public class Stack {
private static Node head;
private static class Node {
private int value;
private Node previous;
Node(int i) {
value = i;
previous = null;
}
}
public static void main(String[] args) {
head = null;
for (int i = 0; i < 10; i++) {
Node n = new Node(i);
n.previous = head;
head = n;
}
// System.out.print(peek());
System.out.print(pop().value);
System.out.println();
printValues(head);
}
private static void printValues(Node n) {
while (n != null) {
System.out.print(n.value + " ");
n = n.previous;
}
}
public static Node pop() {
Node temp = head;
temp.previous = null;
head = head.previous;
// temp.previous = null;
return temp;
}
public static int peek() {
return head.value;
}
...
}
我的问题是 pop() 方法。按照目前的编写方式,当 main 运行时,只有 9 被打印到控制台,而 printValues 方法什么也不产生。但是如果我将 pop() 方法更改为:
public static Node pop() {
Node temp = head;
// temp.previous = null;
head = head.previous;
temp.previous = null;
return temp;
}
现在 main 完全工作了,控制台打印了 9,println() 然后是 8 7 6 5 4 3 2 1 0。
temp.previous = null 的位置究竟影响了什么?
在第一个中,您将 head
变量设置为 null。
Node temp = head;
temp.previous = null;
head = head.previous;
看到了吗?当 temp 引用与 head 引用相同的节点时,您将其前一个设置为 null,然后将 head 设置为其前一个(您刚刚设置为 null)。
在第二个中,您将 head
变量设置为前一个头部的前一个,这是您的意图 - 然后 将前一个头部与其余头部断开连接堆栈。
Node temp = head;
head = head.previous;
temp.previous = null;
我正在练习在 java 中为我的 compsci class 实现堆栈,这是我拥有的:
public class Stack {
private static Node head;
private static class Node {
private int value;
private Node previous;
Node(int i) {
value = i;
previous = null;
}
}
public static void main(String[] args) {
head = null;
for (int i = 0; i < 10; i++) {
Node n = new Node(i);
n.previous = head;
head = n;
}
// System.out.print(peek());
System.out.print(pop().value);
System.out.println();
printValues(head);
}
private static void printValues(Node n) {
while (n != null) {
System.out.print(n.value + " ");
n = n.previous;
}
}
public static Node pop() {
Node temp = head;
temp.previous = null;
head = head.previous;
// temp.previous = null;
return temp;
}
public static int peek() {
return head.value;
}
...
}
我的问题是 pop() 方法。按照目前的编写方式,当 main 运行时,只有 9 被打印到控制台,而 printValues 方法什么也不产生。但是如果我将 pop() 方法更改为:
public static Node pop() {
Node temp = head;
// temp.previous = null;
head = head.previous;
temp.previous = null;
return temp;
}
现在 main 完全工作了,控制台打印了 9,println() 然后是 8 7 6 5 4 3 2 1 0。
temp.previous = null 的位置究竟影响了什么?
在第一个中,您将 head
变量设置为 null。
Node temp = head;
temp.previous = null;
head = head.previous;
看到了吗?当 temp 引用与 head 引用相同的节点时,您将其前一个设置为 null,然后将 head 设置为其前一个(您刚刚设置为 null)。
在第二个中,您将 head
变量设置为前一个头部的前一个,这是您的意图 - 然后 将前一个头部与其余头部断开连接堆栈。
Node temp = head;
head = head.previous;
temp.previous = null;