добавление в связанный список - PullRequest
6 голосов
/ 04 мая 2011

Мне было интересно, как выполняется цикл while. так как мы устанавливаем 'next' в null, когда мы впервые объявляем его, когда оно меняется на not null? а также что означает «Узел n = это; ' имею в виду? Это имеет значение для этого кода? Всякий раз, когда мы объявляем новый экземпляр объекта 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;
    }
}

Ответы [ 3 ]

6 голосов
/ 04 мая 2011

Итак, у вас есть класс с именем 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);

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

    Node n = this;

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

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

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

    n.next = end;

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

  10 -> 20 -> null

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

  x.appendToTail(30);

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

  10 -> 20 -> 30 -> null
6 голосов
/ 04 мая 2011

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

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

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

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

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

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

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

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

enter image description here

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

Надеюсь, это поможет (: Если у вас есть какие-либо вопросы, отправляйте сообщения назад (:

1 голос
/ 04 мая 2011

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

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

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

one.appendToTail(3)

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

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

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

...