Помогите исправить метод

В методе 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;
        }
    }

Все остальное остаётся прежним.

→ Ссылка