Как правильно реализовать метод удаления всех узлов по значению из двусвязного списка?
Подскажите, пожалуйста, как реализовать метод 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;
}
}