代码应如下所示:
public void deleteItem(int target)
{
int index = 0;
CarNode item = head;
CarNode prev = null;
while(item != null)
{
if (index == target) {
if (prev == null) {
head = item.getNode();
return; // We've removed the target.
} else {
prev.setNode(item.getNode());
return; // We've removed the target.
}
}
prev = item;
item = item.getNode();
index++;
}
}
所以让我们分解一下:
int index = 0;
CarNode item = head;
CarNode prev = null;
我们需要两个变量:一个存储我们正在查看的元素,另一个存储前一个元素(一旦我们删除一个元素,我们将使用它来重新连接列表)。首先,我们的当前是头部,而我们的前一个不存在。index
当我们达到目标时会通知我们。
while(item != null)
我们想要迭代直到我们到达列表的末尾,由一个null
节点标记。
if (index == target) {
if (prev == null) {
head = item.getNode();
return; // We've removed the target.
} else {
prev.setNode(item.getNode());
return; // We've removed the target.
}
}
如果我们找到了目标,我们将其移除。如果previous 为null,那么目标是头部,所以我们将头部移动到第二个元素。否则,我们将前一个节点的引用设置为当前节点的引用,这会将当前节点从列表中删除。一旦我们移除目标,我们就完成了,所以我们返回。
prev = item;
item = item.getNode();
index++;
更新先前和当前节点。两者都向前移动一个节点。索引递增。
一个图解的例子怎么样:
取一个大小为 3 的列表。它看起来像这样:
我们现在调用list.deleteItem(1);
This 实例化一个prev
和一个next
节点。next
指向第一个节点,并且prev
为空。
我们的目标是 1,所以我们移动到下一个节点。现在prev
指向以前next
指向的对象,并next
指向列表中的第二个对象(我们要删除的对象)。
我们通过将节点的引用设置为prev
节点的引用来删除它next
。
当我们从该方法返回时,Java 垃圾收集完成了它的工作,剩下的就是:
多田!节点从列表中删除!