Я пытаюсь написать метод, который принимает целое число n и возвращает новый список, содержащий первые n элементов его текущего объекта List, в том же порядке, в котором они появляются в текущем списке.
Решение, которое у меня есть, представлено ниже:
public List firstNelements(int n) {
List newList = newList();
Node travel = head, last = null, newNode;
int counter = 0;
while (counter < n && travel != null) {
newNode = new Node();
newNode.data = travel.data;
if (last == null)
last = newList.head = newNode;
else last = last.next = newNode;
counter++;
travel = travel.next;
}
return newList;
}
Я понимаю, что метод начинается с объявления нового списка. Оттуда он объявляет узел «путешествия», который используется для итерации по всему текущему списку. Кроме того, я считаю, что «последний» как раз и предназначен для отслеживания последнего узла в текущем объекте.
Я также понимаю первую часть цикла while; Однако я не понимаю, почему условный
if (last == null)
last = newList.head = newNode;
else last = last.next = newNode;
присутствует. Узел "last" является нулевым при первом выполнении кода, поэтому на первой итерации я предполагаю, что мы устанавливаем newNode в заголовок нового списка. Но почему мы обновляем последнюю версию? Означает ли это, что «last» отслеживает последний узел в новом списке? Я также понятия не имею, что здесь делает «else».
Я проследил через список {1, 2, 3} с n = 2. Однако я все еще не могу понять этого. Остальная часть цикла while (после этого условия) имеет для меня смысл.