2013-12-22 66 views
0

我想了解node1.next = node3node2 = node3之间的区别。 在链表中,node1.next = node3摆脱node2。但node1.next指向node2反正为什么node2 = node3不能在下面的代码中工作?在java中单向链表中删除一个节点

public class LinkedList { 
    LinkedList head = null; 
    LinkedList next = null; 
    int data = 0; 

    public static void main(String[] args) { 
     LinkedList node1 = new LinkedList(); 
     LinkedList node2 = new LinkedList(); 
     LinkedList node3 = new LinkedList(); 
     node1.data = 1; 
     node1.next = node2; 
     node2.data = 2; 
     node2.next = node3; 
     node3.data = 3; 
     node3.next = null; 

     node2 = node3;// If I replace with node1.next = node3; it works 
     LinkedList h = node1; 
     while (h.next != null) { 
      System.out.println(h.data); 
      h = h.next; 
     } 
    } 
} 
+6

与所有链接列表问题一样,绘制包含框和箭头的图。然后你会明白。 –

+1

这可能会有帮助 - [是Java“通过引用”?](http://stackoverflow.com/q/40480)不是100%相同的问题,但非常接近。 – Dukeling

回答

0
node1 // points to a structure containing: 
    a 
    b 
    c 
    next --> node2 

node2 // points to a structure containing: 
    a 
    b 
    c 
    next --> node3 

node3 // points to a structure containing: 
    a 
    b 
    c 
    next --> <null> 

当您执行node2 = node3,你改变什么,节点2变量指向。这不会改变node1中的任何内容。

当您执行node1.next = node3时,您将更改node1指向的next部分的内容。


在试图使其100%清晰后,评论说这不是。

我们有三个变量,node1,node2和node3。其中的每一个驻留在某个特定地址的内存中,比如说10,20和30.

当一个对象被分配时,在特定地址有一个对应的内存块;让我们说节点1,节点2和节点3的对象已经分配了100,200和300的块。

要说节点1“具有”它的对象的值,那么在实现级别发生的是变量地址处的内存包含分配对象的地址。在我们的例子中,10的内存值为100,20的值为200,30的值为300.

从100开始,由node1指向的内存块中有一个字段,它包含指向另一个这样的对象的指针;在我们的示例中,该字段的值为200.

当我们执行node2 = node3时,我们会将值300放入内存地址20中.20中的内存现在包含300,它在其中包含300 200.但是,所有三个对象仍然存在,并且仍然可以到达,并且这个操作没有改变。所以node1.next的值仍然是200。

我希望这可以100%清楚。如果没有,请告诉我们,我记住的另一个例子是,我的网页边距太小,不能包含...

+0

仍然没有100%清楚。 node2指向node3。为什么链表中的node2不会自动更新? – fidgetyPhil

+0

好的。感谢您的澄清。我想我终于明白了。想象3个房屋(物体)。 node1,node2,node3是三个地址卡。每个房子里面都有一张名为next的空白地址卡,告诉我们接下来要去哪个房子。当node1.next = node2时,我们将由node2表示的object2的位置复制到下一个地址卡上。后来,即使我们更改了node2上的地址,也没关系,因为我们已经将其上的原始地址复制到了node1.next – fidgetyPhil

+0

我必须记住索引卡 - 对于新手程序员来说可能比内存地址更好...如果你觉得它有用,你可以自由地投票选出这个以及任何其他答案,这是SO的工作方式。 – arcy

0

node1.next = node3node1.nextnode3,从而从列表中删除node2

node2 = node 3node2node3;但是,node1.next仍然指向原始的node2(在它被重新分配为指向node3之前),因此不会删除node2

关键外卖如下:

node1.next = node2; 
node2 = null; 

System.out.println(node1.next.data); 
//prints whatever node2's data value was before becoming null 
0

执行代码

node2 = node3; 

不会改变节点1的参考节点2或节点2的参考NODE3

仅此赋值语句改变存储在变量node2处的内容

你这样做之后,节点1仍然可以看到原来的节点2