#linked-list
#связанный список
Вопрос:
Итак, я получаю небольшое представление о том, как работает связанный список и как головной узел указывает на другой узел, который содержит данные, а также адрес следующего узла. Я также рассмотрел примеры. Я просматривал этот код, который я нашел за последние пять часов, запутавшись в том, как display()
использовать метод, который current = head
указывает на следующий узел. Я продолжаю думать head.next = null
и не указывает на следующий узел. Может кто-нибудь объяснить мне, как head.next
указывает на следующий узел или когда он получил адрес, потому что я не могу найти, когда в коде это происходит.
public class SinglyLinkedList {
//Represent a node of the singly linked list
class Node{
int data;
Node next;
public Node(int data) {
this.data = data;
this.next = null;
}
}
//Represent the head and tail of the singly linked list
public Node head = null;
public Node tail = null;
//addNode() will add a new node to the list
public void addNode(int data) {
//Create a new node
Node newNode = new Node(data);
//Checks if the list is empty
if(head == null) {
//If list is empty, both head and tail will point to new node
head = newNode;
tail = newNode;
}
else {
//newNode will be added after tail such that tail's next will point to newNode
tail.next = newNode;
//newNode will become new tail of the list
tail = newNode;
}
}
//display() will display all the nodes present in the list
public void display() {
//Node current will point to head
Node current = head;
if(head == null) {
System.out.println("List is empty");
return;
}
System.out.println("Nodes of singly linked list: ");
while(current != null) {
//Prints each node by incrementing pointer
System.out.print(current.data " ");
current = current.next;
}
System.out.println();
}
public static void main(String[] args) {
SinglyLinkedList sList = new SinglyLinkedList();
//Add nodes to the list
sList.addNode(1);
sList.addNode(2);
sList.addNode(3);
sList.addNode(4);
//Displays the nodes present in the list
sList.display();
}
}
Ответ №1:
Когда вы выполняете итерацию по связанному списку в первый раз, заголовок указывает на firstNode . Затем, когда выполняется цикл while, код обновляет указатель («Текущий»), чтобы указать на следующий узел. Это показано там, где вы видите current = current.next; Циклы продолжают выполняться до тех пор, пока current не укажет значение null, после чего оно заканчивается. Надеюсь, вы лучше понимаете.
Ответ №2:
Вы правы, что head.next
напрямую не назначается. Однако tail.next
есть. Давайте посмотрим, что происходит в addNode()
двух случаях:
- Когда список пуст и вы добавляете узел, оба
head
иtail
устанавливаются вnewNode
. Имейте в виду, что (это Java)head
иtail
являются ссылками на объектnewNode
, то есть они ссылаются на один и тот же объект. - Когда в списке уже есть 1 элемент, и вы добавляете новый узел (второй), который вы устанавливаете
tail.next = newNode
. Теперь помните, чтоhead
иtail
являются ссылками на один и тот же объект (первый добавленный до сих пор). На данный момент это, по сути, два названия одного и того же объекта. Итак, что на самом деле происходит, так это то, что объект, на который ссылаетсяhead
иtail
, получает свойnext
элемент, равныйnewNode
— и теперь обаhead.next
иtail.next
указывают наnewNode
. После этогоtail
сам делается для ссылки на tnenewNode
и в этот моментhead
иtail
начинает ссылаться на разные объекты —head
все еще ссылаясь на первый элемент, аtail
теперь ссылаясь на второй (и пока последний) элемент.
Теперь, когда вы добираетесь до display()
, вы видите, что head
это действительно ссылка на первый элемент списка, его next
указывает на второй и так далее…
Комментарии:
1. спасибо тебе за это, Любомир! Это действительно помогло мне понять сейчас!