为什么这个linkedlist addlast实现可以工作?

mhd8tkvw  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(216)

我正在把一个项目添加到一个链表的末尾(这不是家庭作业…只是我自己的一个练习)。
程序如下:

public class CustomLinkedList {

    private static Node head = null;
    private int size = 0;

    public static void main(String[] args) {
        CustomLinkedList myList = new CustomLinkedList();
        myList.add(5);
        myList.add(9);
        myList.add(3);

        System.out.println("List Size: " + myList.size);
        myList.print();
    }

    private int size() {
        return this.size;
    }

    private void print() {
            Node temp = head;
           for (int i=0; i<=size-1;i++){
                System.out.print(temp.value + " ");
                temp = temp.next;
            }
        System.out.println();
    }

    private void add(int value) {
        if (head == null) {
            head = new Node();
            head.value = value;
            head.next = null;
            size++;
        } else {
            Node temp = head;
            while (temp.next != null) {
                temp = temp.next;
            }
            temp.next = new Node();
            (temp.next).value = value;
            size++;
        }
    }
}

这是我的节点类:

public class Node {
    public int value;
    public Node next;

    public int getValue(){
        return this.value;
    }
}

以下是我认为正在发生的事情:
1.我有一个以“头”开头的原始/正在进行的列表
2.我想把它加到名单上。
3.更重要的是,我需要找到它的结尾。为此,我创建了一个名为temp的新节点(它只是原始列表的一个副本)。
4.我遍历副本(temp)直到到达末尾。
5.一旦到达终点,我就创建一个新节点。
对我来说,这就是我的代码停止的地方。现在,在我看来,我需要添加这样的代码:“好吧,你有了你的新节点,你知道它需要去哪里,所以让我们浏览真正的列表并添加它。”
但我没有。根据我的调试器(下图),发生了正确的事情,但是我没有看到将新节点添加到原始列表的魔力。这是怎么回事?

编辑:
我确实看过其他实现(比如这里的实现);看上去很像。但是,我仍然找不到为什么不给head(或head.next)分配temp就可以工作。我相信理论上是有链表的。我只是不明白为什么这一点起作用。

yks3o0rb

yks3o0rb1#

你的困惑是 temp 不同于 head . 不是的。
它们都是包含对同一变量的引用的变量 Node 对象。通过任一变量所做的更改都反映在它们引用的(同一)对象中。当您添加 Nodetemp ,则将其添加到实际列表中。

相关问题