我正在把一个项目添加到一个链表的末尾(这不是家庭作业…只是我自己的一个练习)。
程序如下:
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就可以工作。我相信理论上是有链表的。我只是不明白为什么这一点起作用。
1条答案
按热度按时间yks3o0rb1#
你的困惑是
temp
不同于head
. 不是的。它们都是包含对同一变量的引用的变量
Node
对象。通过任一变量所做的更改都反映在它们引用的(同一)对象中。当您添加Node
至temp
,则将其添加到实际列表中。