2017-06-22 40 views
0

剛開始學習節點,我有幾個問題。比方說,我有一個節點類,看起來像這樣:關於遍歷,插入和刪除節點的問題

private E number; 
    private Node next; 
    /** 
    * Constructor 
    */ 
    Node(E e){ 
     number = e; 
     next = null; 
    } 

和我有起始節點的一系列鏈接節點的第一個命名的,像這樣:

第一 - >(1) - >(2 ) - >(3) - >(5) - >(6)

假設列表不爲空,遍歷目錄,我會做一些像這樣:

Node curr = first; 
while(curr != null){ 
    System.out.print(curr); 
    curr = curr.next; 
} 

我明白你不能像這樣反向鏈接列表,所以這是否意味着每當我調用curr.next時,之前的元素都會丟失?

我還想知道,如果我的原始列表首先會受像curr這樣的臨時節點列表的影響嗎?例如,如果我是插入或刪除一個節點列表上類似於這些代碼:

插入:

Node curr = first; 
Node newNode = new Node(4); 
while(curr != null){ 
    if(curr.number == 3){ 
     newNode.next = curr.next; 
     curr.next = newNode; 
    } 
    curr = curr.next; 
} 

刪除:

Node curr = first; 
Node parent = first; 
while(curr != null){ 
    if(curr.number == 3){ 
     parent.next = curr.next; 
    } 
    parent = curr; 
    curr = curr.next; 
} 

請問上面的代碼修改第一或在插入或刪除更改後,是否需要設置first = curr;?如果他們先修改,那麼curr = curr.next;怎麼不先修改?如果我想返回刪除的節點怎麼辦?我會只是做一些像curr.next = null;然後return curr;

回答

0

這是否意味着每當我調用curr.next時,以前的元素都會丟失?

當你走過下來列表中,你永遠不會修改first,你永遠不修改任何Nodenext鏈接。所以沒有節點真的丟失。之前訪問過的節點訪問起來不方便,因爲您沒有「處理」,但您可以從列表頭(first)開始,然後從next鏈接開始重新找到它們。

我還想知道,如果我的原始列表首先受到像curr這樣的臨時節點列表的影響嗎?

變量first絕不會比其在=的左側first賦值語句之外的任何影響。另一方面,first所引用的列表可能會相當戲劇性地改變或完全不受影響,具體取決於您使用的是curr,但first本身只能通過將新值分配給first而受到影響。

上面的代碼會先修改還是必須設置first = curr;

插入和刪除代碼,如給出,永遠不會修改first。但是它應該應該是,如果它能夠處理在當前第一個節點之前插入一個新節點,或者刪除當前第一個節點。具體可能不是first = curr,但first肯定需要更新以反映列表的新頭。正如教科書所說,我將其視爲「作爲讀者的練習」。

+0

感謝您的回答!我想我明白了。如果引用它的任何內容被修改,「first」將會改變;否則,我將不得不更新它以發生更改。 –