【问题标题】:remove() of iterator class for LinkedListLinkedList 的迭代器类的 remove()
【发布时间】:2013-03-06 19:19:56
【问题描述】:

所以我试图更好地理解 LinkedLists,一个练习告诉我为我编写的链表类添加实现迭代器类的 remove() 方法。 我的迭代器类如下所示:

public java.util.Iterator<T> iterator() {
    return new java.util.Iterator<T>() {
        Node prev= null,curr = head;

        public boolean hasNext() {  
            if (curr != null) {
                return true;
            }
            return false;
        }

        public T next() {
            T temp = curr.data;
            prev = curr;
            curr = curr.next;
            return temp;
        }

        public void remove() {
            if(prev==null || curr==null)
                head=head.next;
            else
                prev.next=curr.next;
        }
    };
}

我为它写的一个测试有点像这样:

public void testiterator(){
    BasicLinkedList<String> basicList = new BasicLinkedList<String>();
    basicList.addToFront("Blue").addToEnd("Red").addToFront("Yellow");
    for(Iterator<String> i = basicList.iterator(); i.hasNext();){
        if(i.next().equals("Blue"))
            i.remove();
    }
    assertTrue(basicList.toString().equals("\" Yellow Red \""));
}

但是,当我打印 basicList 时,它告诉我列表包含黄色和蓝色而不是黄色和红色。我是在执行 remove() 方法错误,是我使用错误,还是两者兼而有之?

感谢你们的时间!

【问题讨论】:

    标签: java iterator linked-list


    【解决方案1】:

    问题在于curr 不是指返回的最后一个元素,而是指要返回的下一个元素。

    remove() 是要删除前者,而您的方法是删除后者。

    【讨论】:

    • 这几乎强化了我的想法。我通过添加名为 prevOriginal 的第三个节点来修复我的代码。当 next() 被称为 prevOriginal = prev 在任何设置为下一个之前。然后在删除中我使用 prevOriginal.next = prev.next 正确移动列表。粗略我知道,但我想它可以工作:\谢谢!
    【解决方案2】:

    为什么不直接将当前节点设置为下一个节点。为什么要在 remove 方法中检查 null。

    【讨论】:

    • 我想这只是我对迭代器如何工作以及如何使用 remove 方法缺乏了解的结果。我想我忘记了当 .next() 被调用时,它会转移到下一个并且 remove 无法记住原始节点是什么。
    【解决方案3】:

    试试这个伙伴:

    public java.util.Iterator<T> iterator() {
        return new java.util.Iterator<T>() {
            Node<T> prev = null;
            Node<T> curr = null;
    
            public boolean hasNext() {
                if (curr == null) {
                    return (head != null);
                }
                return (curr.next != null);
            }
    
            public T next() {
                if (!hasNext()) {
                    return null;
                }
                if (curr == null) {
                    curr = head;
                } else {
                    prev = curr;
                    curr = curr.next;
                }
                return curr.data;
            }
    
            public void remove() {
                if (curr != null) {
                    if (prev != null) {
                        prev.next = curr.next;
                    } else {
                        head = curr.next;
                    }
                }
            }
        };
    }
    

    【讨论】:

    • 尝试了这个,但它没有正确迭代。有一个只有“黄色”的列表并运行了for(String element: basicList){ System.out.print(element+" "); }
    • 你能把你的代码贴出这3个方法吗:BasicLinkedList(构造函数)、addToFrontaddToEnd
    猜你喜欢
    • 2010-11-04
    • 2015-08-09
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    相关资源
    最近更新 更多