使用引用(临时变量)来操作LinkedList?

时间:2013-03-31 04:09:35

标签: java linked-list nodes

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

    }
}

是的,我不知道我是否理解得很好,但是我被告知你可以使用引用而不必直接引用链表的对象来对链表进行更改。 / p>

一个节点包含Car对象和LinkedList的另一个元素的节点,右边,因此引用基本上是指向与原始对象相同的对象的克隆,但是如何忽略原始对象并且引用需要当我们修改引用的节点时,优先于原来的?对不起,这对我没有任何意义,而且我已经在这个问题上花了好几个小时。

2 个答案:

答案 0 :(得分: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++;

    }
}

答案 1 :(得分:0)

代码应如下所示:

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,则目标是head,所以我们将head移动到第2个元素。否则,我们将前一个节点的引用作为当前节点的引用,从而将当前节点从列表中删除。一旦我们删除目标,我们就完成了,所以我们返回。

prev = item;
item = item.getNode();
index++;

更新以前和当前节点。两者都向前移动了一个节点。索引递增。

一个插图示例怎么样:

获取大小为3的列表。它看起来像这样:

1

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

2

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

3

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

4

当我们从方法返回时,java垃圾收集完成它的工作,我们留下了:

5

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