Как правильно реализовать метод удаления всех узлов по значению из двусвязного списка?

Подскажите, пожалуйста, как реализовать метод removeAll(_value) в двусвязном списке на примере Java или C#. Я попадаю на исключение нулевого указателя, и не пойму, мне просто нужно отловить исключения или я в корне не верно делаю? Как я понял, нужно двигаться с обоих сторон списка и вот что у меня получилось:

public void removeAll(int _value) {
    Node _fromHead = this.head;
    Node _fromTail = this.tail;

    if (this.count == 0) {
         return;
    }
    if (_fromHead.value == _value && this.count == 1) {
        this.clear();
    }
    if (this.count > 1) {
        int iterCount = 0;
        final int state = this.count;
        while (iterCount < state / 2) {
            if (_fromHead.value == _value) {
                if (this.head == _fromHead) {
                    this.head = _fromHead.next;
                    _fromHead.next.prev = null;
                } else {
                    Node prev = _fromHead.prev;
                    Node next = _fromHead.next;
                    prev.next = next;
                    next.prev = prev;
                }
                this.count--;
            }
            assert _fromTail != null;
            if (_fromTail.value == _value) {
                if (this.tail == _fromTail && this.count == 1) {
                    this.clear();
                    return;
                } else if (this.tail == _fromTail) {
                    Node node = _fromTail.prev;
                    this.tail = node;
                    try {
                        node.next = null;
                    } catch (NullPointerException e) {}

                } else {
                    Node prev = _fromTail.prev;
                    Node next = _fromTail.next;
                    try {
                        prev.next = next;
                    } catch (NullPointerException e) {

                    }

                    next.prev = prev;
                }
                this.count--;
            }
            _fromHead = _fromHead.next;
            _fromTail = _fromTail.prev;
            iterCount++;
        }
        if (state % 2 != 0) {
            if (_fromHead.value == _value) {
                this.clear();
            }
        }
    }
}

Ответы (2 шт):

Автор решения: Pentiux

как сделал бы я:

public void removeAll(int _value) {
    Node _fromHead = this.head;
    Node _fromTail = this.tail;
    
    while (_fromHead != null) {
        if(_fromHead.value == _value) {
             //удаляем и переназначаем ссылки с ноды
             continue;
        }
    _fromHead = _fronHead.next
    }
}

типа такого что-то

→ Ссылка
Автор решения: ghetto-coder

в итоге, после подсказки Pentiux реализовал так:

 public void removeAll(int _value) {
        Node _fromHead = this.head;
        while (_fromHead != null) {
            if (_fromHead.value == _value) {
                if (this.count == 1) {
                    this.head = null;
                    this.tail = null;
                    this.count = 0;
                } else if (this.head == _fromHead) {
                    this.head = _fromHead.next;
                    _fromHead.next.prev = null;
                } else {
                    _fromHead.prev.next = _fromHead.next;
                    try {
                        _fromHead.next.prev = _fromHead.prev;
                    } catch (NullPointerException e) {

                    }
                }
                this.count--;
            }
            _fromHead = _fromHead.next;
        }
    }
→ Ссылка