Java 练习实现堆栈时,需要帮助理解奇怪的行为
我正在练习用java为我的compsci类实现堆栈,以下是我所拥有的:Java 练习实现堆栈时,需要帮助理解奇怪的行为,java,stack,Java,Stack,我正在练习用java为我的compsci类实现堆栈,以下是我所拥有的: 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 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;
}
...
}
现在主控台可以完全工作了,控制台会打印一个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
变量设置为前一个head的previous,这是您的意图-然后将前一个head从堆栈的其余部分断开
Node temp = head;
head = head.previous;
temp.previous = null;
在第一个示例中,您将
head
变量设置为null
Node temp = head;
temp.previous = null;
head = head.previous;
看到了吗?当temp引用的节点与head引用的节点相同时,可以将其“上一个”设置为null,然后将head设置为其“上一个”(仅设置为null)
在第二个示例中,您将head
变量设置为前一个head的previous,这是您的意图-然后将前一个head从堆栈的其余部分断开
Node temp = head;
head = head.previous;
temp.previous = null;
在第一个示例中,您将
head
变量设置为null
Node temp = head;
temp.previous = null;
head = head.previous;
看到了吗?当temp引用的节点与head引用的节点相同时,可以将其“上一个”设置为null,然后将head设置为其“上一个”(仅设置为null)
在第二个示例中,您将head
变量设置为前一个head的previous,这是您的意图-然后将前一个head从堆栈的其余部分断开
Node temp = head;
head = head.previous;
temp.previous = null;
在第一个示例中,您将
head
变量设置为null
Node temp = head;
temp.previous = null;
head = head.previous;
看到了吗?当temp引用的节点与head引用的节点相同时,可以将其“上一个”设置为null,然后将head设置为其“上一个”(仅设置为null)
在第二个示例中,您将head
变量设置为前一个head的previous,这是您的意图-然后将前一个head从堆栈的其余部分断开
Node temp = head;
head = head.previous;
temp.previous = null;
所以,尽管temp是head的副本,它仍然会影响head?我得想一想。临时工不是头的副本。这是对同一个对象的引用。好吧,这澄清了它。所以尽管temp是head的副本,它仍然会影响head?我得想一想。临时工不是头的副本。这是对同一个对象的引用。好吧,这澄清了它。所以尽管temp是head的副本,它仍然会影响head?我得想一想。临时工不是头的副本。这是对同一个对象的引用。好吧,这澄清了它。所以尽管temp是head的副本,它仍然会影响head?我得想一想。临时工不是头的副本。这是对同一个对象的引用。好的,这就澄清了它。