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++;