#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
. Таким образом, для хвостового узла не требуется никаких дополнительных действий.