2011-05-04 72 views
6

我在想如何執行while循環。由於我們在首次聲明時將'next'設置爲null,它何時會更改爲非空?還有什麼'Node n = this; ' 意思?這對代碼有意義嗎?每當我們聲明對象Node的新實例時,它是否會從類中創建它自己的單獨字段的副本?謝謝一堆!我一定會欣賞清晰易懂的解釋。再次感謝=)追加到鏈表

class Node { 
    Node next = null; 
    int data; 
    public Node(int d) { data = d; } 
    void appendToTail(int d) { 
     Node end = new Node(d); 
     Node n = this; 
     while (n.next != null) { n = n.next; } 
     n.next = end; 
    } 
} 
+0

這是什麼語言? – 2011-05-04 01:02:36

回答

6

因此,您有一個名爲Node的類,其中包含兩個名爲next和data的實例變量。它們被稱爲實例變量,因爲它們屬於這個類的實例,而不屬於類本身。也就是說,你的類基本上是一個對象的模板(或藍圖),每個對象將擁有自己的數據值和下一個值。

爲了創建一個Node類的實例,您需要調用構造函數並傳遞必要的參數。在你的情況下,構造函數是;

public Node(int d) { 
     data = d; 
    } 

要調用此構造函數,請使用new關鍵字(在Java中,我假設)像這樣;

Node x = new Node(10); 

並注意到您必須爲構造函數提供一個整數值。在構造函數的主體中({}之間),您會看到變量數據被分配給d中的值,該值是您傳遞給構造函數的值,在本例中爲值10.您現在有一個類型的對象值爲10的節點是數據,下一個節點是空值。

在該對象上,您現在可以調用方法appendToTail()。可以說我們這樣做:

x.appendToTail(20); 

讓我們跟蹤發生了什麼。創建

Node end = new Node(d); 

命名結束一個新節點,我們設定的值20的數據(記住,d的值是20,現在,因爲這是我們當我們調用方法傳遞的值)。這是一個完全獨立於x的節點,具有自己獨特的數據值。

Node n = this; 

這是一個自參考當前對象。既然我們在x上調用了這個方法,那麼這個對象就和x一樣。

while (n.next != null) { 
     n = n.next; 
    } 

這個while循環將開始尋找名單從當前節點要到下一個節點,直至下一個節點是空的結束。由於我們迄今爲止創建的唯一節點是x,因此n.next實際上是null,所以while循環不會執行這一次。

n.next = end; 

現在我們將n(它是x)的下一個值設置爲創建的節點端。現在,您有這樣的名單:

10 -> 20 -> null 

假如你做以下電話:

x.appendToTail(30); 

然後類似的事情發生,當你到了while循環值n.next是除不是null,所以你進入循環的主體,並指定n指向n.next,在我們的例子中是20節點。循環的下一個迭代將產生null,因此循環將退出,新節點將與數據30將被設置爲列表中最後一個節點的下一個值。所以你將有:

10 -> 20 -> 30 -> null 
+0

感謝您的幫助! – david 2011-05-04 02:07:04

6

回答您的問題:

問:「既然我們設置‘下一步’爲空時,我們首先聲明它,當它得到改變不空?」

當列表中只有一個項目時,該節點的'next'值將被設置爲NULL。

問:「還有'Node n = this'是什麼意思?」

該語句表示引用變量'n'取當前對象的引用,該引用由'this'指定。

問:「每當我們聲明對象Node的新實例時,它是否會從類中創建它自己的單獨字段的副本?」

將爲您創建實例的每個單獨的類創建實例變量。這意味着每個節點將有'下一個'和'數據'。

因此,在你的創作過程中,你可能有這樣的事情:

enter image description here

此外,while循環迭代到列表的末尾,並在最後一個節點後附加物品名單。

希望它可以幫助(如果您有任何疑問,請回發(:

+0

+1對於一些優秀的圖表 – 2011-05-04 01:20:37

+0

謝謝!我希望視覺方法能給出一個更好的主意(:只是希望能夠幫助(:乾杯! – Vern 2011-05-04 01:32:12

+0

非常感謝您的幫助! – david 2011-05-04 02:06:47

1

沒有的節點不進行自我複製 鏈表的一點是要有一個節點指的是線下。 。 所以,如果你有一個LinkedList 3項,第一個節點都有一個參照第二,第二至第三。

Node one = new Node(1); 
one.appendToTail(2); 

將導致節點之一,並創造了一個新的節點,並把它在下一場 one.next.data將等於2.

one.appendToTail(3) 

將導致節點1指向節點2,節點2將創建節點3並將其設置爲下一個字段。

one.data == 1 
one.next.data == 2 
one.next.next.data == 3 

該循環基本上是搜索行中的最後一個節點(因爲它有它的下一個設置爲空)。

+0

感謝您的幫助! – david 2011-05-04 02:06:54