Nie działa lista samodzielnie napisana

0

Hej, z tej strony Cyckoben
Mam problem, napisałem uproszczoną Listę w Javie, ale nie działa, wyskakuje błąd: Exception in thread "main" java.util.NoSuchElementException

Mam metody addFirst, addLast, removeFirst, removeLast, getFirst, getLast, getAtIndex
Chyba jest błąd z dodawaniem albo usuwaniem

class List<E> {
    private class Node<T> {
        T object;
        Node<T> previous;
        Node<T> next;

        Node(T object, Node<T> previous, Node<T> next) {
            this.object = object;
            this.previous = previous;
            this.next = next;
        }
    }

    private Node<E> first;
    private Node<E> last;
    private int size;

    public List() {
        first = null;
        last = null;
        size = 0;
    }

    public void addFirst(E object) {
        Node<E> node = new Node<>(object, null, first);

        if (first != null)
            first.previous = node;

        first = node;
        ++size;
    }

    public void addLast(E object) {
        Node<E> node = new Node<>(object, last, null);

        if (last != null)
            last.next = node;

        last = node;
        ++size;
    }

    public void removeFirst() {
        if (first != null) {
            first = first.next;
            if (first != null)
                first.previous = null;

            --size;
        }
    }

    public void removeLast() {
        if (last != null) {
            last = last.previous;
            if (last != null)
                last.next = null;

            --size;
        }
    }

    public E getFirst() {
        if (first != null)
            return first.object;

        throw new NoSuchElementException();
    }

    public E getLast() {
        if (last != null)
            return last.object;

        throw new NoSuchElementException();
    }

    public void clear() {
        first = null;
        last = null;
        size = 0;
    }

    public int getSize() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }
5

Jak dodajesz pierwszy element listy, a ma ona rozmiar zero, to powinieneś ustawić także last na ten element (jeden element -> first = last)
Jak kasujesz pierwszy element listy, a ma ona rozmiar jeden, to powinieneś ustawić także last na null (jeden element -> first = last)

public void addFirst(E object) {
    Node<E> node = new Node<>(object, null, first);

    if (first != null)
        first.previous = node;
    else
        last = node;

    first = node;
    ++size;
}

public void removeFirst() {
    if (first != null) {
        if (last == first)
            last = null;

        first = first.next;
        if (first != null)
            first.previous = null;

        --size;
    }
}

Analogicznie dla dodawania/kasowania ostatniego elementu listy

Btw. Przydałoby się trochę więcej tych metod, chociaż add/remove/get z int index, jakieś indexOf, find itp.

1 użytkowników online, w tym zalogowanych: 0, gości: 1