2013-03-31 31 views
1
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++; 

    } 
} 

是的,我不知道我是否理解得很好,但我被告知可以使用引用,并且不必直接引用链表的对象以便对链表执行更改。使用引用(临时变量)来操作LinkedList?

一个节点包含Car对象和LinkedList中另一个元素的节点right,所以引用基本上是一个指向与原始对象相同的对象的克隆,但是如何忽略原始对象以及引用当我们修改引用的节点时,它优先于原始文件?对不起,这对我来说没有任何意义,我一直在为此挠了挠头。

+2

我建议你检查一下参考文献是什么,然后改述你的问题。很难弄清楚你遇到了什么问题。 _“在我们修改引用的节点时引用优先于原始引用”_似乎没有多大意义,即使在代码的上下文中也是如此。你能编辑你的文章并重新修改具体的问题吗? –

+0

引用我的意思是下一个和前一个,而不是项目。 – user2089523

+0

向我们展示'CarNode'的定义...以及'CarNode next =(item.node).node;'这两行似乎都包含一个错误(其中一个“节点”应该是“next” )_and_也可能意味着下一个指针在存储在列表中的数据中,而不是在listnode中,这将是一个设计问题。 –

回答

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. 
    } 
} 

如果我们已经找到了目标,我们将其删除。如果之前为空,那么目标是头部,所以我们将头部移动到第二个元素。否则,我们使前一个节点的引用成为当前节点的引用,从而将当前节点从列表中删除。一旦我们移除了目标,我们就完成了,所以我们回来了。

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

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

+0

ahh我有解析它的困难,但返回到底做了什么? – user2089523

+0

prev.node = item.node;和previous.setNode(next);是等同的,对吗? – user2089523

+0

'return'结束当前的方法。至于'previous.setNode(next)',如果'node'不公开,那实际上是正确的调用。我会编辑它。等一下。 –

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

    } 
} 
+0

啊谢谢,所以有一些错误,但没有重大的逻辑错误。你为什么突破;? – user2089523

+0

现在检查@ user2089523,当我们移除目标时,我做了'break',因为目标与索引\唯一键相关联,如果它与一个值相关联,我们可以处理多个事件 –

+0

@ user2089523 Khaled使用'break'与我使用'return'(至少在这种情况下)是一样的:它只是用来在我们完成时退出该方法。 –