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

    }
}

是的,我不知道我是否理解得很好,但是有人告诉我,您可以使用引用,而不必直接引用链表的对象来对链表执行更改。

一个节点包含 Car 对象和 LinkedList 的另一个元素的节点,对,所以引用基本上是一个克隆,指向与原始对象相同的对象,但是为什么原始被忽略并且引用优​​先于原来我们修改引用的节点的时候?抱歉,这对我来说没有任何意义,我已经为此挠头好几个小时了。

4

2 回答 2

1

代码应如下所示:

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 的列表。它看起来像这样:

1

我们现在调用list.deleteItem(1);This 实例化一个prev和一个next节点。next指向第一个节点,并且prev为空。

2

我们的目标是 1,所以我们移动到下一个节点。现在prev指向以前next指向的对象,并next指向列表中的第二个对象(我们要删除的对象)。

3

我们通过将节点的引用设置为prev节点的引用来删除它next

4

当我们从该方法返回时,Java 垃圾收集完成了它的工作,剩下的就是:

5

多田!节点从列表中删除!

于 2013-03-31T04:46:41.787 回答
1
public void deleteItem(int target) 
{
    int index = 0;
    CarNode item = head;

    CarNode next = null;
    CarNode previous = null;

    // stop when the linked-list ends
    while(item != null)
    {
        // the tail has no next node
        if (item.node != null)
            next = item.node.node;
        else
            next = null;

        // if targetIndex exist, remove it
        //     "logically" from the linekd-list
        if (index == target)
        {
            previous.setNode(next);
            break;
        }

        // today is tomorrow's yesterday
        previous = item;
        item = item.node;
        index++;

    }
}
于 2013-03-31T04:50:17.723 回答