Двусвязный список - метод RemoveFirst - PullRequest
0 голосов
/ 10 мая 2018

Мне нужна помощь со следующим кодом:

public boolean remove(Integer value) {

    if (isEmpty()) {
        throw new NoSuchElementException();
    }
    if (!isEmpty()) {
        if (head == tail) {
            head = tail = null;
        }
    } else {


    }

    size--;

    return false;
}

И это моя задача:

"удаляет первое вхождение указанного значения из этого списка"

Это метод двусвязного списка.

Пока что я думаю, что все сделал правильно, но мне все еще не хватает части "else", и я понятия не имею, что поместить внутрь ...

У меня также есть класс с конструктором и методами получения и установки.

Вот мой класс узла:

public class ListElement {

    private Integer value;
    private ListElement next;
    private ListElement prev;

    public ListElement(ListElement prev, Integer value, ListElement next) {
        this.value = value;
        this.next = next;
        this.prev = prev;
    }

    public Integer getValue() {
        return value;
    }

    public ListElement getNext() {
        return next;
    }

    public ListElement getPrev() {
        return prev;
    }

    public void setValue(Integer value) {
        this.value = value;
    }

    public void setNext(ListElement next) {
        this.next = next;
    }

    public void setPrev(ListElement prev) {
        this.prev = prev;
    }

}

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Я предполагаю, что по сигнатуре функции вы хотите удалить элемент с определенным значением.Вам нужно найти этот узел и удалить его:

public boolean remove(Integer value) {

    if (isEmpty()) {
        throw new NoSuchElementException();
    }
    ListElement found = head;
    // Try to find it
    while (null != found && !found.value.equals(value)) {
         found = found.next;
    }
    // Not found?
    if (null == found) {
        throw new NoSuchElementException();
    }
    // Found. Unlink
    if (found.prev != null) found.prev.next = found.next;
    else head = found.next;
    if (found.next != null) found.next.prev = found.prev;
    else tail = found.prev;

    size--;

    return true;
}
0 голосов
/ 10 мая 2018

Во-первых, это if должно быть удалено, так как вы уже тестируете на пустое

if (!isEmpty()) {
    if (head == tail) {
        head = tail = null;
    }
} else {


}

Затем вы можете обрабатывать как:

public boolean remove(Integer value) {
    if (isEmpty()) {
        throw new NoSuchElementException();
    }

    if (head == tail) {
        if (head.getValue() == value) {
            head = tail = null;
        } else  {
            // Not found, return false
            size--;
            return false;
        }
    }

    ListElement current = head;
    while (current != null) {
        if (current.getValue() == value) {
            // Found
            if (current.getPrev() == null) {
                // current node is head node
                head = current.getNext();
                current.setPrev(null);
            } else if (current.next() == null) {
                // current node is tail node
                tail = current;
                current.setNext(null);
            } else {
                // Current node is in the middle
                ListElement prev = current.getPrev();
                ListElement next = current.getNext();
                prev.setNext(next);
                next.setPrev(prev);
            }
            size--;
            return true;
        }
    }
    // Not found
    size--;
    return false;
}
...