0

我正在尝试使用自定义迭代器/链表类删除最后一个迭代元素。由于某种原因,它只对列表中的第一项(头部条件)执行此操作。条件有什么问题吗?

我是否应该在 If (prev=head) 之后而不是 Else 中写 If (next != null) 来查找中间节点,并使用 If (next = null) 来查找最后一个节点?第二个问题:要删除项目,我是否也应该写 prev.element = null (现在我只有 prev = null,我想这会删除节点但不会删除它的内容。

很简单,我的删除方法有什么问题,因为我自己无法弄清楚。非常感谢你们。我已经为此工作了很多小时,但我仍然没有让它工作。

public E next() {
    if (!hasNext())
        throw new NoSuchElementException ();
    prev = next;
    E element = next.element;
    next = next.next;
    return element;
}

public void remove() { 
    if(prev == null) {
        throw new IllegalStateException();
    }
    else {
        if(prev == head){
            head = head.next;
            next = head;
        }
        else {
            next = prev.next;
        }
        sizeOfList--;
        prev = null;
    }
}
4

2 回答 2

0

这是我对给定代码的最佳猜测

if(prev == head){ 应更改为 if(prev.equals(head)){使用equals方法。

而且我认为您必须在相应的元素类中覆盖 equals 方法可能肯定会有所帮助。

==仅检查两个变量是否引用内存中的同一对象,其中等于检查Object state

我希望它有所帮助:)。

于 2013-11-05T06:38:24.827 回答
0

您需要一个while循环才能遍历列表中的每个节点,直到您到达最后一个节点。就像现在一样,您的代码只是越过头部,然后进入说 sizeOfList-- 然后 prev = null; 的代码。

你需要这样的东西:

while (prev.next.next != null) {
    prev = prev.next;
}

prev.next = null;

我做 prev.next.next 以便您可以将链表中的倒数第二个节点设置为指向空值(由 完成prev.next = null;)。可以这样想:prev 是列表中倒数第二个元素,prev.next 是最后一个元素,显然 prev.next.next 必须为空(因为 prev.next 是 LAST。)所以一旦这是在这种情况下,通过将第二个到最后一个元素设置为指向空值来删除最后一个元素。

然后减少您的列表计数。

于 2013-11-05T07:12:42.583 回答