我试图使用自定义迭代器/链接列表类删除最后一个迭代元素。它出于某种原因只对列表中的第一项(头部条件)执行此操作。这些条件有什么问题吗?
我应该在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;
}
}
答案 0 :(得分:0)
这是我对给定代码的最佳猜测
if(prev == head){
应更改为 if(prev.equals(head)){
使用等于方法。
我认为你必须在相应的元素类中重写equals方法可能肯定有帮助。
==
仅检查两个变量是否引用内存中的同一对象,其中equals检查对象状态。
我希望它有所帮助:)。
答案 1 :(得分: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是null(因为prev.next是最后的。)所以一旦这是case,通过将2nd到last元素设置为空值来删除最后一个元素。
然后递减列表计数。