我是链接列表的新手,我在从单个链接列表中删除特定对象时遇到问题。该方法根本不会删除列表中的第一个元素,但它似乎也一次删除多个节点。
删除方法:
public void remove(Element e)
{
Node dummy = new Node(null);
dummy.next = firstNode;
Node temporary = dummy;
while (temporary.next != null)
{
if (e.getString1().compareTo(temporary.next.getElement().getString1()) < 0)
{
temporary.next = temporary.next.next;
}
else
{
temporary = temporary.next;
}
}
}
私有节点类(以及Node
类中的第一个ElementList
)
Node firstNode = null; private class Node
{
Element value;
Node next = null;
private Node(Element e)
{
this.value = e;
}
public Element getElement()
{
return value;
}
}
演示方法:
list.add(vvv);
list.add(eee);
list.add(ddd);
list.remove(eee);
System.out.println(list); //<- Output: all three objects still appear
list.remove(vvv);
System.out.println(list); //<- Output: vvv is there, for some reason
eee and ddd are now gone
list.remove(ddd);
System.out.println("Break between last element and empty list");
System.out.println(list); //<- Output: vvv is still there
答案 0 :(得分:1)
你至少有两个问题。可能更多。没有更完整的代码就很难分辨。
首先:在您的问题评论中引用了这一点。这一行:
if (e.getString1().compareTo(temporary.next.getElement().getString1()) < 0)
这里使用的比较可能不是你想要的。请参阅String.compareTo()
(Javadoc)的文档。
第二:你永远不会在{{1}中更改对firstNode
的引用(我假设,您将利用所有地方作为列表的头部) }} 方法。当然remove()
会坚持下去;你永远不会改变vvv
指向除此之外的任何东西。
我怀疑这是作业,所以我不打算提供问题的代码答案,但这些应该可以告诉你问题在哪里。如果不是作业;绝对使用内置的Java列表而不是自己创建。