2014-01-14 44 views
0

嗨,夥計們我正在做一些與Java測試。如何設置已經實例化爲空的變量?

請參閱方法deleteMiddleNode(),該方法假定給定節點,將其在鏈接列表中刪除。 這一切工作正常,除了我想刪除最後一個節點的情況。 我所做的是將最後一個節點設置爲null,如果這是要刪除的節點(請參閱評論)。它並不真正有效,並且s5仍然有其價值。

當我只想重置s5的屬性key時,它確實有效。

我想知道爲什麼它的行爲如此。

public class Three { 
    static SinglyNode s5 = new SinglyNode(5); 

    public static void main(String[] args) { 
     SinglyNode s1 = new SinglyNode(1); 
     SinglyNode s2 = new SinglyNode(2); 
     SinglyNode s3 = new SinglyNode(3); 
     SinglyNode s4 = new SinglyNode(4); 

     s1.next = s2; 
     s2.next = s3; 
     s3.next = s4; 
     s4.next = s5; 
     deleteMiddleNode(s5); 

     SinglyNode ptr = s1; 
     while (ptr!= null) { 
      System.out.print(ptr.key+" "); 
      ptr = ptr.next; 
     } 
    } 

    // this method is wrong 
    public static boolean deleteMiddleNode(SinglyNode node){ 
     if (node == null) { 
      return false; 
     } 
     if (node.next == null) { // last node 

    /* this part does work 
      System.out.println(node.key); 
      node.key = 222; 
      System.out.println(s5.key);          
    */ 

      node = null; // but this doesn't set the last node to null. 

      return true; 
     } 
     node.key = node.next.key; 
     node.next = node.next.next; 
     return true; 
    } 

} 

class SinglyNode { 

    int key = 0; 
    SinglyNode next = null; 

    public SinglyNode (int key){ 
     this.key = key; 
    } 

} 
+4

Java是*通過值*。您不改變方法之外的'node'參考值。 –

+1

輕微,但重要的注意事項,如果它被設置爲「null」,它沒有被實例化。 –

回答

1

Java是傳值

這意味着變量保存引用值(就像C中的指針一樣),當您將它們傳遞給方法時,該值將被複制到方法內部的局部變量中。更改本地變量包含的內容(例如,將其設置爲null)不會影響該方法以外的任何內容。

在你的榜樣,你的方法簽名是:

deleteMiddleNode(SinglyNode node) 

當你調用從主deleteMiddleNode(s5),包含在s5參考值在你的方法被複制到node

+0

你的評論是公平的 - 我解釋了它應該怎麼做,但不是爲什麼它沒有工作。 – Jason

+1

@Jason Eh,我重新思考它。我認爲我們兩人之間,OP應該是好的。我沒有解釋如何解決它:) –

1

比方說,你有聯繫的節點列表:甲 - >乙 - 「ç - > d - > E.

要從鏈接列表中刪除節點C,你需要找到一個鏈接節點到C,在這種情況下是B,並將其目標節點更改爲D(C用於鏈接到的內容)。

然後,由於C沒有被任何人引用,它最終將被垃圾收集。

因此,在您的示例中,要刪除s5,您需要將s4的.next屬性設置爲null,從而表明鏈接列表在s4結束。

由於您始終保留對列表中第一個項目的引用,如果您想要刪除此第一個項目,只需將您的'第一個項目引用'替換爲其.next參考。

+0

你應該提及應該刪除'A'的情況。他會失去進入他的名單的切入點。 –

+0

@ThorstenDittmar好點 - 上面編輯。 – Jason

0

如評論所述,Java通過參數的值而不是的參考。因此,在deleteMiddleNode中設置nodenull確實將本地變量(參數變量)設置爲null,但不是您從調用者傳遞的變量。

您需要在調用代碼中將其設置爲null

另一種方法是通過兩個節點(node)至被刪除,其在前節點(previous)的方法,然後設置到previous.nextnode.next刪除從鏈(本身不具有到節點node設置爲null,因爲它將被垃圾收集,設置爲null不會影響到這一點)。然後再次需要對第一個節點進行特殊處理,因爲您在列表中失去了「入口點」。

相關問題