2015-07-03 68 views
-2

我對JAVA和OOP相當陌生,目前我正在學習一門學習java的數據結構和算法的學術課程。java類如何使用它自己的引用類型

當我正在學習關於鏈表的實現時,我遇到了一個小問題,那就是在實現鏈表(我熟悉構造函數和遞歸位)時不知道如何創建節點。

Node類的代碼如下

public class Node { 
    public int info; 
    public Node next, prev; 
    public Node (int el) { 
     this (el,null,null); 
    } 
    public Node (int el,Node n,Node p){ 
    info = el; next =n; prev=p; 
    } 
} 

我需要知道發生了什麼幕後當List類的代碼執行(特別是如何在3號線工程)和代碼是如下

public class List { 
    private Node head, tail; 
    public List (){ 
     head = tail = null; 
    } 
    public boolean isEmpty(){ 
     return head == null; 
    } 
    public void addToTail (int el) { 
     if (!isEmpty ()) { 
     tail = new Node (el, null, tail); 
     tail.prev.next = tail; 
     } 
     else head = tail = new Node(el); 
    } 
    public int removeFromTail (){ 
    int el = tail.info; 
     if (head == tail) 
     head = tail =null; 
     else 
     { 
     tail = tail.prev; tail.next = null; 
     } 
    return el; 
    } 
} 

(這個例子是在那裏我學習學院給出我想知道它是如何工作)

請解釋節點類別是如何工作的。

+0

你有任何特定的問題嗎? – John

+0

你可以通過一個調試器,並在「雙向鏈表」中進行閱讀。有很多好的圖表應該解釋。 – weston

+0

您是否發佈了List類的完整代碼?有一個雙向鏈表是沒有意義的,然後只有addToTail/removeFromTail方法。似乎沒有任何機制可以實際遍歷列表。 – dave

回答

1

好吧,讓我們從Node

public Node next, prev; 
    public Node (int el) { 
     this (el,null,null); 
    } 

這裏的對象nextprev是當前節點的下一個和以前的節點引用(這是您當前對象(this))

啓動this (el,null,null);

這意味着你正在創建它沒有一個或下一個節點的節點。當您傳遞null時,爲next和previous傳遞null。它與頭部創建頭部類似,沒有下一個和前一個節點。

當您創建的頭,你永遠不會改變,但是當你在你的列表

創建第二個元素當您創建鏈表

的尾巴,你會改變下一個頭部的時間
public void addToTail (int el) { 
     if (!isEmpty ()) { 
     tail = new Node (el, null, tail); 
     tail.prev.next = tail; 
     } 
     else head = tail = new Node(el); 
    } 

在這裏您先tail = new Node (el, null, tail); 創建一個尾節點,然後拿到前面的尾巴,並通過做tail.prev.next = tail;

每添設的分組與尾部的下一個元素Ë你添加一個新的節點向被叫方addToTail(int e1)哪些更新尾部和更新下一個老尾部的名單。

0

我需要知道代碼執行時幕後發生了什麼(特別是line3如何工作)。

請解釋Node類是如何工作的。引用對象類型

public Node next, prev; 

Java變量是引用,不是值。字段nextprev不是節點對象。否Node對象包含其他節點。相反,nextprev參考Node對象分開存儲。

如果您來自C或C++,您可以將這些引用看作是指針。

編輯:

如果你不是要求對一般的鏈表的結構,你的節點類代表一個節點,包含一個單一的項目,在一個雙向鏈表。在雙向鏈表中,每個節點引用前面的節點和後面的節點。

在這篇相關維基百科文章中查看這個illustration of a doubly linked list

List就像一列火車。 A Node就像火車上的一輛車。這些鏈接是節點之間的參考,類似於列車車廂之間的耦合。您詢問的nextprev字段是節點之間的鏈接。

邏輯上,列表包含整個列車。在物理上,列表引用列車的頭部和尾部,以便它可以從前到後或從後到前穿過節點。

+1

不是一個真正的答案,只是對他們沒有做出的幾點修正。 – weston

+0

@Andy Thomas tbh這不回答OPs過於寬泛的問題 – John

+0

@weston - OP問及關於第3行的問題,對於初學Java程序員最常見的誤解是引用變量是對象的概念。我認爲這很可能是解決OP的混亂根源。但是,正如您所看到的,它足夠寬泛,我可能會被誤解。所以,讓我擴大答案。 –

0

我們假設你的代碼的入口點是一個電話:

List list = new List(); 
list.addToTail(1); 
list.addToTail(2); 
list.removeFromTail(); 

的第一行代碼執行構造成列表類,它只是設置的頭部和尾部等於空。

的第二行代碼添加方法addToTail,並設置可變頭部和尾部等於新節點(1),其調用僅具有在Node類一個參數的構造。

代碼的第三行添加方法addToTail,但是這次列表不是空的,因此腳本將進入if語句以及使用Node(2,null,tail)保存的節點。如果使用三個參數檢查此Node構造函數,則tail(您之前添加的值爲1的節點)將設置爲與當前節點關聯的prev(previous)節點。

的最後一行代碼刪除與該碼尾= tail.prev所述第二節點; tail.next = null;並返回剛刪除的元素。

0

首先在Java節點的特定類型的變量,它可以做一個變量的正常工作和有其他的信息讓她點上的其他節點,你的情況是public Node next, prev;

通常節點使用在列表中,認爲這樣的火車,這就是爲什麼你必須addtootail這裏或removefromtail。 在這個鏈接,你會發現一個非常相當的解釋。 http://www.vias.org/javacourse/chap14_02.html

0

Node類封裝了數據,在這種情況下是一個名爲info的整數值。

此外,List被實現爲Nodes序列。

nextprev值在Node中的原因是,節點可以鏈接到列表序列中的其上一個和下一個節點。訪問列表中的節點的唯一方法是遍歷列表,或者使用next引用進行轉發,或者使用prev引用向後轉發。

請注意,列表不支持像數組那樣的隨機訪問。要到達某個元素,您需要沿某個方向遍歷該列表。

相關問題