2017-10-18 117 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」和你正在創建的新節點之間的鏈接,所以不會有新的節點附加到鏈表上。

所以我們必須停止時,我們發現當前旁邊是空的循環,我們必須在當前的下一個位置