Java 使用引用(临时变量)操作LinkedList?
是的,我不知道我是否理解得很好,但我被告知可以使用引用,而不必直接引用链接列表的对象来对链接列表执行更改Java 使用引用(临时变量)操作LinkedList?,java,linked-list,nodes,Java,Linked List,Nodes,是的,我不知道我是否理解得很好,但我被告知可以使用引用,而不必直接引用链接列表的对象来对链接列表执行更改 一个节点包含Car对象和LinkedList的另一个元素的节点,对吧,所以引用基本上是一个克隆,指向与原始对象相同的对象,但是当我们修改引用的节点时,为什么原始对象被忽略并且引用优先于原始对象?对不起,这对我来说毫无意义,我已经为此挠头好几个小时了 代码应该如下所示: public void deleteItem(int target) { int index = 0; C
一个节点包含Car对象和LinkedList的另一个元素的节点,对吧,所以引用基本上是一个克隆,指向与原始对象相同的对象,但是当我们修改引用的节点时,为什么原始对象被忽略并且引用优先于原始对象?对不起,这对我来说毫无意义,我已经为此挠头好几个小时了 代码应该如下所示:
public void deleteItem(int target)
{
int index = 0;
CarNode item = head;
while(item != null)
{
CarNode next = (item.node).node;
CarNode previous = item;
if (index == target)
{
previous.setNode(next);
}
item = element.node
index++;
}
}
那么让我们来分析一下:
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;
我们希望迭代,直到到达列表的末尾,由null
节点标记
while(item != null)
如果我们找到了目标,我们就把它移除。如果previous为null,则目标是head,因此我们将head移动到第二个元素。否则,我们将前一个节点的引用设置为当前节点的引用,这将从列表中删除当前节点。一旦我们移除目标,我们就完成了,所以我们返回
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.
}
}
更新以前的和当前的节点。两者都向前移动一个节点。索引是递增的
举个例子怎么样:
拿一张3号的单子。看起来是这样的:
public void deleteItem(int target)
{
int index = 0;
CarNode item = head;
while(item != null)
{
CarNode next = (item.node).node;
CarNode previous = item;
if (index == target)
{
previous.setNode(next);
}
item = element.node
index++;
}
}
现在我们调用list.deleteItem(1)代码>这将实例化一个prev
和一个next
节点next
指向第一个节点,prev
为空
我们的目标是1,所以我们移动到下一个节点。现在prev
指向用于指向的next
,并且next
指向列表中的第二个对象(我们要删除的对象)
我们通过将prev
节点的引用设置为next
节点的引用来删除它
当我们从方法返回时,java垃圾收集完成了它的工作,剩下的是:
塔达!节点已从列表中删除 我建议你回顾一下什么是推荐信,并重新表述你的问题。很难弄清楚你有什么问题。“当我们修改引用的节点时,引用优先于原始引用”似乎没有多大意义,即使在代码的上下文中也是如此。你能编辑你的帖子并重新表述具体的问题吗?我指的是下一个和上一个,而不是项目。告诉我们CarNode
。。。还有,行carnodenext=(item.node).node
似乎都包含错误(其中一个节点应该是下一个),也可能意味着下一个指针在列表中存储的数据中,而不是在listnode中,这将是一个设计问题。private class CarNode{private Car Car;private CarNode;}您想要整个类吗?因为它只有典型的getter和setter。啊,谢谢,所以有一些错误,但没有重大的逻辑错误。你为什么要分手;?现在检查@user2089523,当我们删除目标时,我确实打破了
,因为目标与index\unique key关联,如果它与一个值关联,我们可以处理多个occurrences@user2089523Khaled使用的break
与我使用的return
相同(至少在这种情况下)“USE2089523吉米使用<代码>返回<代码>是可以的,我个人建议避免使用<代码>返回<代码>从一个循环中中断,<代码>返回<代码>在函数的中间就像中止,如果将来该功能被修改,则改用break
可以增强可维护性。@user2089523。如果您愿意,可以在我使用的return
位置替换break
。它也会做同样的事情。我很难解析它,但是return到底做什么呢?prev.node=item.node;和上一个.setNode(下一个);是等效的,对吗?return
结束当前方法。至于previous.setNode(next)
,如果node
不是公共的,那么这实际上是正确的调用。我会编辑的。等等
prev = item;
item = item.getNode();
index++;