Помогите исправить метод
В методе addLast() нужно добавить элемент в конец списка, но не знаю как. Пробовал реализовать, но переменная first хранит null и метод сразу завершается.
public class MyList<T> {
private static class Node<T> {
private T t;
private Node<T> next;
public Node(T t) {
this.t = t;
}
}
private Node<T> first;
public void addFirst(T t) {
Node<T> newFirst = new Node<>(t);
newFirst.next = first;
first = newFirst;
}
public void addLast(T t) {
Node help = first;//здесь должна быть ссылка на первый элемент в листе, а не null!!!
Node<T> newLast = new Node<>(t);
while (help != null) {
if (help.next == null) {
help.next = newLast;
}
help = help.next;
}
}
public T removeFirst() {
Node<T> oldFirst = first;
first = first.next;
return oldFirst.t;
}
@Override
public String toString() {
StringBuilder listBuilder = new StringBuilder();
Node currentNode = first;
while (currentNode != null) {
listBuilder.append(currentNode).append(" ");
currentNode = currentNode.next;
}
return listBuilder.toString();
}
}
Ответы (2 шт):
Автор решения: Igor
→ Ссылка
public void addLast(T t) {
Node<T> newLast = new Node<>(t);
Node oldLast = getLast();
if (oldLast == null)
first = newLast;
else
oldLast.next = newLast;
}
private Node getLast() {
Node help = first;
while (help != null && help.next != null) {
help = help.next;
}
return help;
}
Автор решения: St1mX
→ Ссылка
Столкнулся с такой проблемой "Переполнение стека", чтобы избежать этого нужно добавить хвост и работать с ним.
private Node<T> first;
private Node<T> tail;
public void addFirst(T t) {
Node<T> newFirst = new Node<>(t);
if (first == null) {
first = newFirst;
tail = newFirst;
} else {
newFirst.next = first;
first = newFirst;
}
}
public void addLast(T t) {
Node<T> newLast = new Node<>(t);
if (first == null) {
first = newLast;
tail = newLast;
}
else {
tail.next = newLast;
tail = newLast;
}
}
Все остальное остаётся прежним.