2016-05-30 2 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_node1 в head_node и new_node в current_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

Хорошо! спасибо –

Смежные вопросы