3 回答
TA贡献1784条经验 获得超7个赞
在您的方法中,要删除的节点是trace.next(您将其称为del)。这意味着需要将thattrace的next指针更新为trace.next.next,从而有效地“跳过”要删除的节点 ( trace.next)。这看起来像:trace.next = trace.next.next
相反,您正在做的是trace通过将其设置为trace.next.next. 我知道这是为了使迭代正常工作,但会弄乱您的其余代码,因为您丢失了指向需要更新的节点的指针。如果我们修改trace.next,循环将trace = trace.next在结束运行时处理正确推进指针。
在 Java 中,不再有指向它的引用的对象会从计算机内存中删除——这个过程称为垃圾收集。由于此时我们已经进行了修改trace.next,因此没有对要删除的节点的进一步引用,以保留del您创建的变量。一旦该变量在此函数结束时超出范围,该节点将被垃圾收集,您无需采取进一步行动。你甚至根本不需要 del 变量;一旦我们trace.next通过更新(跳过)旧节点而丢失了对旧节点的引用,就不会再存在对该节点的引用,垃圾收集器将剔除它。
考虑到所有这些,您的代码就变成了:
public void deletenode(int data) {
Node trace;
for(trace = head; trace != null; trace = trace.next) {
if(trace.next.data == data) {
trace.next = trace.next.next;
}
}
}
TA贡献1808条经验 获得超4个赞
public void deletenode(int data) {
if (head != null && head.data == data) {
head = head.next; // delete head
return;
}
Node prev = null;
Node cur = head;
while (cur != null && cur.data != data) {
prev = cur;
cur = cur.next;
}
prev.next = cur.next; // delete cur
}
添加回答
举报