我正在阅读有关Java中简单LinkedList实现的this文章,并对其进行了调整,几乎没有对我的小项目进行任何更改。一切都运作良好,但删除方法 这笔交易是我必须删除相应的元素。我的意思是(这是我的删除方法):
private Link head;
public void remove(Object obj) {
if (task == null)
System.out.println("no");
else {
Link linkCurr = head;
if (head != null) {
for (int i = 0; i < size; ++i) {
if (obj.equals(linkCurr.getData())){
linkCurr.setNext(linkCurr.getNext().getNext());
size--;
break;
}
linkCurr = linkCurr.getNext();
}
}
}
}
这是运行节点和链接逻辑的类。
private class Link
{
Link next;
Object data;
public Link(Object data) {
next = null;
this.data = data;
}
public Task getData() {
return data;
}
public Link getNext() {
return next;
}
public void setNext(Link next)
{
this.next = next;
}
}
所以,问题是以下 - 当我删除列表中的第一个obj时(通过将其设置为删除参数) - 它会消失,但如果我尝试删除第二个或任何其他内容,下一个我想要删除后 我要感谢任何帮助,提前谢谢。如果需要更多信息,我的LinkedList here!的完整代码。
答案 0 :(得分:4)
问题似乎出现在这段代码中:
Link linkCurr = head;
if (head != null) {
for (int i = 0; i < size; ++i) {
if (obj.equals(linkCurr.getData())){
linkCurr.setNext(linkCurr.getNext().getNext());
size--;
break;
}
linkCurr = linkCurr.getNext();
}
}
这样做是在列表中搜索与输入节点匹配的节点。然后,它将该节点的下一个链接设置为线下的节点2,删除相邻节点。
您可能希望保留上一个节点的索引,并在其上执行setnext,如:
Link linkCurr = head;
Link previous = null;
if (head != null) {
for (int i = 0; i < size; ++i)
{
if (obj.equals(linkCurr.getData()))
{
if (previous == null)
{
head = linkCurr.getNext(); // sets 2nd position to head of list
size--;
break;
}
previous.setNext(linkCurr.getNext()); // removes the node
size--;
break;
}
previous = linkCurr;
linkCurr = linkCurr.getNext();
}
}