Как работает следующий объект в связанном списке? Как он может заставить объекты другого класса указывать на следующий адрес?

#class #object #pointers #linked-list #iterator

#класс #объект #указатели #связанный список #итератор

Вопрос:

 class Node
{
    public int data;
    public Node next;
    
    public Node(int idata) {
        data = idata;
        next = null;
    }
}

Node newnode = new Node(val);
newnode.next = null;
  

Например, если я создаю новый объект newnode узла класса, как он может использовать .next для поиска следующего адреса в списке?

Ответ №1:

В вашем примере код next просто null . На самом деле, это не было необходимости делать явно newnode.next = null; , поскольку оно уже было инициализировано null в Node конструкторе.

Становится еще интереснее, когда вы назначаете другой новый узел next свойству созданного вами узла:

 Node newnode = new Node(1);
newnode.next = new Node(2);
  

В Java доступ к объектам осуществляется по ссылкам. newnode является такой ссылкой, а newnode.next также такой ссылкой. Оба являются ссылками на Node экземпляры (если нет null ).

Мы могли бы расширить связанный список дальше:

 newnode.next.next = new Node(3);
newnode.next.next.next = new Node(4);
  

Когда вы понимаете, что next это свойство, которое может содержать значение, подобное любой переменной, тогда в этом действительно нет волшебства.

Вы могли бы, например, также сначала создать экземпляры узла, которые отключены, и только после их создания связать их вместе:

 Node a = new Node(1);
Node b = new Node(2);
Node c = new Node(3);
Node d = new Node(4);

a.next = b;
b.next = c;
c.next = d;


 
  

Комментарии:

1. У меня просто есть еще одно сомнение, так что, как в вашем примере, если d — последняя ссылка, которую мы добавляем, будет ли она автоматически указывать на null? или мы должны явно написать d.next = null ?

2. new Node() Вызов выполнит код в конструкторе Node класса, и там next установлено значение null . Таким образом, для хвостового узла не требуется никаких дополнительных действий.