的代码应该是这样的:
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.
}
}
如果我们已经找到了目标,我们将其删除。如果之前为空,那么目标是头部,所以我们将头部移动到第二个元素。否则,我们使前一个节点的引用成为当前节点的引用,从而将当前节点从列表中删除。一旦我们移除了目标,我们就完成了,所以我们回来了。
prev = item;
item = item.getNode();
index++;
更新以前和当前节点。两者都向前移动一个节点。索引增加。
如何图示的例子:
取尺寸3.列表它看起来像这样:
我们现在称之为list.deleteItem(1);
此实例化一个prev
和next
节点。 next
指向第一个节点,并且prev
为空。
我们的目标是1,所以我们移动到下一个节点。现在prev
指向next
用来指向什么,next
指向列表中的第二个对象(我们想要移除的那个)。
我们通过设置prev
节点的引用是next
节点的引用将其删除。
当我们从方法返回,Java的垃圾回收,它的工作,我们就只剩下:
田田!节点已从列表中删除!
我建议你检查一下参考文献是什么,然后改述你的问题。很难弄清楚你遇到了什么问题。 _“在我们修改引用的节点时引用优先于原始引用”_似乎没有多大意义,即使在代码的上下文中也是如此。你能编辑你的文章并重新修改具体的问题吗? –
引用我的意思是下一个和前一个,而不是项目。 – user2089523
向我们展示'CarNode'的定义...以及'CarNode next =(item.node).node;'这两行似乎都包含一个错误(其中一个“节点”应该是“next” )_and_也可能意味着下一个指针在存储在列表中的数据中,而不是在listnode中,这将是一个设计问题。 –