2017-10-18 118 views
-1

我正在为链表写一个插入方法,并且发现有一件事很难理解。它的工作原理使用此代码遍历时:遍历java中的链表

class Node { 
int data; 
Node next; 
Node(int d) { 
     data = d; 
     next = null; 
    } 
} 

public static Node insert(Node head,int data) { 
    Node conductor = head; 
    if(conductor == null){ 
     head = new Node(data); 
    } 
    else{ 
     while(conductor.next != null){ 
      conductor = conductor.next; 
     } 
     conductor.next = new Node(data); 
    } 
    return head; 
} 

,但如果我改变while循环:

 while(conductor != null){ 
      conductor = conductor.next; 
     } 
     conductor = new Node(data); 

它不工作。我不明白有什么不同。 任何人都可以帮忙吗?

+1

添加新节点在第一个,之后的'while','conductor'是最后一个元素在列表中。第二,'导体'是'空'而不是列表的一部分。 –

+2

让我明白这一点:您将代码更改为不同的代码,然后您想知道为什么它不同?你为什么不举一个短名单的例子来解决失败者在做什么? –

+0

我明白了!我误解了null。我认为最后一个节点指向的null有一个引用,所以只要导体指向null,它就会成为列表的一部分。现在我知道null是null,它不包含任何引用。谢谢! –

回答

0

第一循环停止conductor保持在列表中的最后节点的引用,即,它是其next为空的一个。它是您要修改的节点,您可以使用conductor.next = new Node(data)执行此操作。

随着第二循环停止时conductornull这是完全无用的,几乎可以肯定不是你想要的。

+0

谢谢我现在明白了! –

0

的问题是,如果你遍历元素,直到你打一个null您将设置conductor是一个新的Node这不会有任何connnection到列表中的其余部分:

[node0] -> [node1] -> `null` ... [node2] -> null 
            ^^^-- your inserted element 

你想要什么取而代之的是找到最后元素并附加您的新Node作为您最后一个元素的next。这就是为什么它被称为链接列表。当你insert您从最后一个元素的链接下一个:

[node0] -> [node1] -> [node2] -> null 
         ^^^-- your inserted element 
+0

这很清楚!非常感谢你。 –

-1

你必须明白,你的局部变量Node conductor,是参考到一个对象,而不是对象本身,既不是复制的。

所以在循环conductor = new Node(data);结束只是让这个参考到一个全新的对象。它不会更改列表本身。

+0

是的,我明白了。非常感谢你。 –

0

让的说链表

1-> 2-> 3-> 5>空

你当它到达空指针,并创建一个新的节点,但不是在写停止循环当前下一个将打破“5”和你正在创建的新节点之间的链接,所以不会有新的节点附加到链表上。

所以我们必须停止时,我们发现当前旁边是空的循环,我们必须在当前的下一个位置