【发布时间】:2016-03-27 22:09:31
【问题描述】:
我正在努力将一个项目添加到链接列表的末尾(这不是家庭作业......只是我自己的练习)。
这是程序:
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. 我有一个以“head”开头的原始/正在进行的列表。
2. 我想添加到该列表中。
3. 要添加它,我需要找到它的结尾。我通过创建一个名为 temp 的新节点(它只是原始列表的副本)来做到这一点。
4. 我遍历副本 (temp) 直到我到达终点。
5. 到达终点后,我创建一个新节点。
对我来说,这就是我的代码停止的地方。现在,在我看来,我需要添加这样的代码:“好吧,你有你的新节点,你知道它需要去哪里,所以让我们通过真正的列表并添加它。”
但我没有那个。根据我的调试器(下图),正确的事情正在发生,但我没有看到将新节点添加到原始列表中的魔力。这是如何工作的?
编辑:
我确实看过其他实现(比如here);它看起来非常相似。但是,如果不将 temp 分配给 head (或 head.next ),我仍然无法找到它的工作原理。我相信理论上我得到了链接列表。我只是不明白为什么这个位有效。
【问题讨论】:
-
什么行“head = temp”?代码很好,也很有意义,尽管可以显着减少和重构。
-
除了@Bohemian Given C++ 代码外,还向您的 JAVA 代码添加逆序值。
-
@Bohemian 我尝试编辑我的问题。我描述了我认为在我的代码中发生的事情与正在发生的事情。希望这能让我的问题更清楚。
标签: java data-structures linked-list