2016-05-30 55 views
0

這是合併兩個排序鏈表的代碼。現在我的問題在於給出的合併函數。我們爲什麼將new_node1引用到new_node。直接在函數中使用new_node1而不是做 「Node new_node = new_node1;」 (無論如何,我嘗試直接使用,但它沒有生成所需的輸出,它只是生成合並列表的最後一項)new_node對象是否使用默認構造函數?詳細的解釋將非常有用。提前感謝。啓動一個對象到其他對象

static class Node{ 
    int data; 
    Node next; 
    Node(int num){ 
     data=num; 
     next=null; 
    } 
} 

// Function for merging two sorted linked list 

public void merge(Linkedlist list1,Linkedlist list2){  
    Linkedlist l=new Linkedlist(); 

    Node new_node1=new Node(0); 
    Node new_node=new_node1; //This line of code is my doubt! 
    while(list1.head!=null || list2.head!=null){  
     if(list1.head!=null && list2.head!=null){ 
     if(list1.head.data<=list2.head.data){ 
      new_node.next=list1.head; // what difference it makes by using new_node.next instead of new_node1 
      list1.head=list1.head.next;   

     } 
     else{ 
      new_node.next=list2.head; 
      list2.head=list2.head.next; 
      }   
     } 
     else if(list1.head==null){   
       new_node.next=list2.head; 
       list2.head=list2.head.next; 
      } 
     else if(list2.head==null){   
       new_node.next=list1.head; 
       list1.head=list1.head.next;     
     } 
     new_node=new_node.next; 
     //new_node1=new_node1.next; 
    } 
    l.printlist(new_node1); 

} 

回答

0

唯一的區別在於最後一行l.printlist(new_node1);。如果您在整個循環中一直使用new_node1,那麼您將打印最後一個節點。當您在循環中一直使用new_node時,new_node1保持不變,指向列表頭部。

我建議重命名爲new_node1head_nodenew_nodecurrent_node。這會讓你更容易理解。然後,你得到的東西是這樣的:

Node head_node = new Node(0); 
Node current_node = head_node; 

// .. build the entire list of nodes .. 

l.printlist(head_node); 
+0

由於參考變量。我知道了 –

+0

你可以告訴current_node將使用什麼構造函數嗎?它是定義我的默認構造函數還是構造函數? –

+0

沒有構建新對象。沒有構造函數被調用。這兩個變量都指向同一個對象,該對象只在Node節點head_node = new Node(0);''一行上構建一次。 'current_node'只是指向'head_node'指向的同一個對象。 –

-1

這裏

new_node1 

是一個對象。

雖然

new_node 

是被用於指向的節點列表中的

+0

你可能會想到C而不是Java。 –

+0

如果不清楚:'new_node1'和'new_node'都不是對象,本身。它們都是對象的引用。最初,它們是對同一個對象的引用;在循環的每次迭代結束時,'new_node'成爲新對象的引用,而'new_node1'保持原始引用。 –

+1

好的!謝謝 –

相關問題