Java 练习实现堆栈时,需要帮助理解奇怪的行为

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;

我正在练习用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 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?我得想一想。临时工不是头的副本。这是对同一个对象的引用。好的,这就澄清了它。