2017-10-06 39 views
0

所以我從頭開始構建LinkedList。儘管代碼有效,但我對兩件事情感到困惑。引用,對象,LinkedList

當你寫(public node root)你正在創建一個對象的引用?換句話說,這是一個指針?如果是,在方法add()我檢查第一次迭代是否爲根equalsnull,它是和代碼創建該類的一個實例。

我的問題來自方法Find()。當根目錄是null,並且我設置了temp1=root時,不是temp1也將是null因爲rootnull?或者temp1指向rootroot指向null?這些有何不同?

編輯:如果temp1爲null那麼爲什麼方法find()工作?

public class LinkedList { 

    public Node root; 

    public void add(int data) { 
     if(root == null) { 
      root = new Node(data);   
     } 
     else { 
      Node temp1 = root; 
      Node temp = new Node(data); 

      while(temp1.getNext() != null) { 
       temp1 = temp1.getNext(); 
      } 

      temp1.setNext(temp);      
     }  
    } 

    public boolean Find(int data) { 
     Node temp1 = root; 

     while(temp1 != null) { 
      if(temp1.getData() == data) { 
       return true; 
      } 
      temp1 = temp1.getNext(); 
     } 

     return false; 
    } 
} 
+0

如果你調用'查找()'那麼你有可能已經被稱爲'加()'所以'root'沒有更長的空。 – csmckelvey

+0

你的意思是如果我調用root在find()中使用我是從add()調用它?我認爲這是從頂部調用.. – Armin

+0

當你說「如果我叫根」,我不確定你的意思。 'root'只是一個變量,你不會「調用」它。我在說,如果你有一個LinkedList實例並且你調用了Find()方法,那麼這個列表可能會有一些內容調用之前的add()方法,這意味着root不再爲null,因爲它獲取第一次調用add()時,就會返回值。即使您沒有先調用add(),您的Find()也會有一個空檢查來防止異常。 – csmckelvey

回答

0

Java中的任何對象值變量實際上是對存儲在堆中的實際對象的引用。

在你Find方法,你分配參考roottemp1,你現在基本上是有2個引用相同Node對象。

如果你打電話Find調用addroot(和temp1因爲它們指向同一個對象)是null所以這個函數總是返回false.

只有調用add,其中一個Node對象的引用將前後被分配到root,是否有可能返回true

0

當你寫(公共節點根)你創建一個對象的引用?

是的。你正在聲明一個Node類型的對象引用。由於您未初始化此參數值,因此參考值爲空。 Java引用就像其他語言的指針,雖然有一些關鍵的區別。像指針一樣,對象引用的值將是一個包含對象的內存地址。與其他語言不同,您不能使用Java引用進行指針運算。

Java Language Specification有此說關於這個問題:

參考值(通常只是引用)是指向這些 對象,和一個特殊的空引用,這是指沒有對象。

我最初正在做一個更多的語法參數,但在回到JLS之後,我同意引用是指針,儘管Java中不支持C-Style指針操作。

當root爲空,並且我設置temp1 = root時,temp1是否也會爲null,因爲root是null?

是的,溫度將被分配根值。也就是說,它將引用root當前引用的同一個Node實例。如果在進行此調用時root爲空,則temp1也將爲空。

在你的代碼中,你的可能(可能應該)像這樣在構造函數中初始化你的根節點。每次在其他方法中調用新的LinkedList()時,這將初始化您的根節點。請注意,我做了幾個其他小的改動,以使這個類更符合:

public class LinkedList { 

    // made this private 
    // be sure to add get/set methods to access/change this value 
    // if needed outside this class 
    private Node root; 

    // default (no-arg) constructor 
    public LinkedList() { 
     root = new Node(); 
    } 

    public void add(int data) { 
     Node temp1 = root; 
     Node temp = new Node(data); 

     while(temp1.getNext() != null) { 
      temp1 = temp1.getNext(); 
     } 

     temp1.setNext(temp);      
    } 

    public boolean find(int data) { 
     Node temp1 = root; 

     while(temp1 != null) { 
      if(temp1.getData() == data) { 
       return true; 
      } 
      temp1 = temp1.getNext(); 
     } 

     return false; 
    } 
} 
+0

如果我這樣做,我們不會有一個額外的節點,數據將爲0.我認爲通過這樣做我將有一個我沒有聲明的節點。至少我的編譯器正在顯示什麼。 – Armin