为什么这个LinkedList addLast实现有效?

时间:2016-03-27 22:09:31

标签: java data-structures linked-list

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

以下是该计划:

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.我有一个原始/正在进行的列表,以&#34; head开头。&#34;
我想补充一下这个清单 3.要添加它,我需要找到它的结尾。我这样做是通过创建一个名为temp的新节点(它只是原始列表的副本)。
我遍历副本(临时),直到我到达终点 5.一旦我到达终点,我创建一个新节点。

对我而言,这是我的代码停止的地方。现在,在我看来,我需要添加一些代码,说明,&#34;好吧,你有新的节点,你知道它需要去哪里,所以让我们浏览真实的列表然后添加它。&#34;

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

enter image description here

编辑:
我确实看过其他实现(比如here);它看起来非常相似。但是,我仍然无法在没有指定temp(或head.next)的情况下找到原因。我相信我在理论上得到了链接列表。我只是不明白为什么这一点有用。

1 个答案:

答案 0 :(得分:1)

您的疑惑是temp 与<{em>不同head。不是。

它们都是将引用保存到相同 Node对象的变量。通过任一变量进行的更改都会反映在它们引用的(相同)对象中。当您向Node添加temp时,请将其添加到真实列表中。