【问题标题】:Java / Implementing LinkedListJava / 实现链表
【发布时间】:2015-10-17 19:00:43
【问题描述】:

我正在尝试通过嵌入类来实现链接列表,但在将元素插入列表时遇到问题。 为什么我的解决方案不起作用?我可以使用 get() 通过这种方式返回一个元素,但是一旦我的迭代器到达目的地,我就无法插入一个元素。

public void insert(int index, int value) {

    Node iterator = head;

    int i=0;
    while(iterator != null) {

        if(i++ == index) {

            iterator = new Node(value, iterator);
            return;

        } else {

            iterator = iterator.next;

        }   

    }       

}

【问题讨论】:

    标签: java reference insert linked-list


    【解决方案1】:

    您的iterator 是此函数调用中的临时变量。当您将其引用重新分配给另一个对象时,您实际上并没有在此函数范围之外修改 Linked-List。您应该改用以下

    if(i++ == index) {
        iterator.next = new Node(value, iterator);
        return;
    }
    

    注意iterator.next 而不是仅仅重新分配迭代器。 这样,您将按照您的意图修改链接列表,而不是仅仅修改函数调用结束后将超出范围的局部变量。

    【讨论】:

    • 它不起作用。例如我添加 1 2 3 4 和 insert(1, 10) 我的输出是: 1, 2, 10, 2, 10, 2 .....
    • 您在打多个电话吗?或者只是一个 insert 调用并导致多个 2 和 10。由于修改添加到 iterator.next,您可能希望将 if 语句从 if(i++ == index) 更改为 if(++i == index)
    • 我使用像 get(0...n) 这样的“gets”并且只有一个 insert()
    • 需要注意的一点是在修改节点的next 字段后将后面的节点缝合回去。即当您将 (1) 添加到 (0) -> (2) 时,您需要确保将 (1) 的 next 修改为 (1) -> (2),然后再将 (0) 的 next 修改为(0) -> (1)。所以你不会丢失任何尾节点。无论哪种方式,修改局部变量iterator的原始问题是概念上最困难的部分。
    • 只要你有对实际对象(LinkedList、PriorityQueue、HashMap)的引用,你就可以使用引用进入对象并对其进行修改。关键是您不能修改对对象的本地引用。 iterator 是对对象的本地引用,更改引用不会更改对象 iterator.next 或者实际上 iterator.{anything} 实际上修改了对象,而不是本地引用。这正是你想要的:)
    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2012-10-15
    • 2016-09-27
    相关资源
    最近更新 更多