gpt4 book ai didi

java - 为什么这个 LinkedList addLast 实现可以工作?

转载 作者:行者123 更新时间:2023-12-01 10:09:12 24 4
gpt4 key购买 nike

我正在努力将一个项目添加到链接列表的末尾(这不是家庭作业......只是我自己的练习)。

这是程序:

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++;
}
}
}

这是我的 Node 类:

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

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

这是我认为正在发生的事情:
1. 我有一个以“head”开头的原始/正在进行的列表。
2. 我想添加到该列表中。
3. 要添加它,我需要找到它的结尾。我通过创建一个名为 temp 的新节点(它只是原始列表的副本)来做到这一点。
4. 我遍历副本(临时),直到到达末尾。
5. 到达末尾后,我将创建一个新节点。

对我来说,这就是我的代码停止的地方。现在,在我看来,我需要添加这样的代码:“好吧,你有了新节点,你知道它需要去哪里,所以让我们浏览一下真实的列表并添加它。”

但是我没有。根据我的调试器(下图),正确的事情正在发生,但我没有看到将新节点添加到原始列表的魔力。这是如何运作的?

enter image description here

编辑:
我确实查看了其他实现(例如 here );它看起来非常相似。但是,我仍然找不到为什么它可以在不将 temp 分配给 head (或 head.next)的情况下工作。我相信理论上我得到了链接列表。我只是不明白为什么这个位会起作用。

最佳答案

您的困惑是 temphead 不同。事实并非如此。

它们都是保存对相同Node对象的引用的变量。通过任一变量所做的更改都会反射(reflect)在它们引用的(同一)对象中。当您将 Node 添加到 temp 时,您会将其添加到 real 列表中。

关于java - 为什么这个 LinkedList addLast 实现可以工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36253275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com