2011-05-04 2 views
6

Мне было интересно, как цикл while выполняется. так как мы устанавливаем 'next' равным null, когда мы сначала объявляем его, когда он изменяется на не null? а также что делает «Node n = this; ' имею в виду? Является ли это значимым для этого кода? Когда мы объявляем новый экземпляр объекта Node, он делает копию своих отдельных полей из класса? Огромное спасибо! Я определенно буду признателен за четкие и понятные объяснения. Еще раз спасибо =)присоединение к связанному списку

class Node { 
    Node next = null; 
    int data; 
    public Node(int d) { data = d; } 
    void appendToTail(int d) { 
     Node end = new Node(d); 
     Node n = this; 
     while (n.next != null) { n = n.next; } 
     n.next = end; 
    } 
} 
+0

На каком языке это? –

ответ

6

Итак, у вас есть класс под названием Node с двумя переменными экземпляра, называемыми next и data. Они называются переменными экземпляра, поскольку они относятся к экземплярам этого класса, а не к самому классу. То есть ваш класс в основном является шаблоном (или планом) для объектов, у каждого из которых будет свое собственное значение данных и следующее значение.

Чтобы создать экземпляр класса Node, вам нужно вызвать конструктор и передать необходимые параметры. В вашем случае это конструктор;

public Node(int d) { 
     data = d; 
    } 

Для вызова этого конструктора вы используете новое ключевое слово (в Java, которое я предполагаю), как это;

Node x = new Node(10); 

И обратите внимание, что вы должны указать целочисленное значение для конструктора. В теле конструктора (между {}) вы видите, что переменным данным присваивается значение в d, которое является значением, которое вы передаете конструктору, в этом примере значение 10. Теперь у вас есть объект типа Узел со значением 10 как его данные и нулевым следующим узлом.

На этом объекте вы можете теперь вызвать метод appendToTail(). Допустим, мы делаем это:

x.appendToTail(20); 

Позволяет отслеживать, что происходит.

Node end = new Node(d); 

Новый узел с именем конец создаются и мы устанавливаем значение 20 для данных (помните, что d имеет значение 20 на данный момент, потому что это значение, которое мы прошли, когда мы называли метод). Это полностью независимый узел от x со своим уникальным значением для данных.

Node n = this; 

Это самостоятельная ссылка на текущий объект. Так как мы назвали этот метод на х, то это тот же объект, что и х.

while (n.next != null) { 
     n = n.next; 
    } 

Этот цикл в то время как собирается начать искать конец списка, перейдя от текущего узла к следующему узлу, пока следующий узел не является нулевым. Поскольку единственным узлом, который мы создали до сих пор, является x, тогда n.next фактически является нулевым, поэтому цикл while не выполняется на этот раз.

n.next = end; 

Теперь мы устанавливаем следующее значение n (которое равно x) на созданный узел. Теперь у вас есть список, как это:

10 -> 20 -> null 

Предположим, что вы должны были сделать следующий вызов:

x.appendToTail(30); 

Тогда подобное происходит, за исключением, когда вы получаете время цикла значение n.next является не null, поэтому вы переходите в тело цикла и назначаете n для указания на n.next, который в нашем примере является узлом с 20. Следующая итерация цикла даст значение null, чтобы цикл завершился, и новый узел с данные 30 будут установлены на следующее значение последнего узла в списке. Таким образом, у вас будет:

10 -> 20 -> 30 -> null 
+0

благодарит за вашу помощь! – david

6

Чтобы ответить на ваши вопросы:

Q: «так как мы установили„рядом“, чтобы быть пустым, когда мы сначала объявить ее, когда она переодеваться не нуль?»

Когда у вас есть только один элемент в списке, значение «next» этого узла будет установлено равным NULL.

В: «а также что означает« Node n = this? »?

Это утверждение означает, что ссылочная переменная 'n' принимает ссылку на текущий объект, который указан «этим».

В: «Когда мы объявляем новый экземпляр объекта Node, он делает копию своих отдельных полей из класса?»

Переменные экземпляра будут созданы для каждого отдельного класса, в котором вы делаете экземпляр. Это означает, что каждый Узел будет иметь «следующий» и «данные».

Таким образом, в вашем процессе создания, вы, вероятно, будет что-то вроде этого:

enter image description here

Кроме того, цикл повторяется в то время как к концу списка и присоединяет элемент после последнего узла в список.

Надеется, что это помогает (Если у вас есть какие-либо вопросы, не отправлять обратно (:

+0

+1 для некоторых отличных диаграмм –

+0

Спасибо! Надеюсь, что визуальный подход даст лучшую идею (: Просто надеемся помочь (: Cheers! – Vern

+0

за вашу помощь! – david

1

Нет узел не копирует себя Точка связанного списка должны иметь узел, обратитесь к следующей строке. . Так что если у вас есть 3 элементов в LinkedList, первый узел имеет ссылку на второй, а второй к третьей.

Node one = new Node(1); 
one.appendToTail(2); 

приведет к узлу одной, создав новый узел, и положить он в следующем поле one.next.data будет равен 2.

one.appendToTail(3) 

приведет к узлу, относящемуся к узлу 2, а узел 2 создаст узел 3 и установит его как следующее поле.

one.data == 1 
one.next.data == 2 
one.next.next.data == 3 

Цикл в основном предназначен для поиска последнего узла в строке (поскольку он имеет следующий набор равным нулю).

+0

благодарит за вашу помощь! – david

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