【问题标题】:Why does this LinkedList addLast implementation work?为什么这个 LinkedList addLast 实现有效?
【发布时间】: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


【解决方案1】:

您的困惑是temphead不同。不是。

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

【讨论】:

  • 谢谢!这是公平的,并且在大多数情况下是有道理的。但这与此有何不同:假设我有 int x = 5,我说 int y = x。那么如果 x 改变,y 也会改变。但是,如果 y 发生变化,这并不意味着 x 会发生变化。所以,对我来说,这就像说,Node temp = head,如果 head 改变,temp 改变,但是如果 temp 改变,head 不一定改变。
  • 现在我想起来了,这个逻辑可能不成立,因为我将原始类型与对象进行比较......
猜你喜欢
  • 1970-01-01
  • 2010-10-17
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2013-12-17
  • 1970-01-01
  • 2011-06-19
相关资源
最近更新 更多