我正在阅读 this关于在 Java 中实现简单 LinkedList 的文章,并在几乎没有对我的小项目进行任何更改的情况下对其进行了调整。一切正常,但删除方法。
交易是我必须删除相应的元素。我的意思是(这是我的删除方法):
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 时(通过将其设置为 remove 的参数) - 它消失了,但是如果我尝试删除第二个或其他任何一个,在我想要的被删除之后的下一个。
我将不胜感激任何帮助,在此先感谢。如果需要更多信息,我的 LinkedList 的完整代码 here! .
最佳答案
问题似乎出在这段代码中:
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();
}
}
关于java - Java 简单LinkedList 的 self 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37860956/