Алгоритмическое мышление при решении задач (на примере языка C#). Шамшев А.Б - 90 стр.

UptoLike

Составители: 

90
if (head.data == delValue) {
head = head.next;
}
}
}
Логично предположить, что если в голове не будет удаляемого данного, то
больше голову просматривать не надо, т. е. надо прервать цикл.
А следовательно, добавить оператор прерывания цикла.
public void delByValue(int delValue) {
while (head != null)
if (head.data == delValue) {
head = head.next;
} else break;
}
Если после удаления список стал пустым, то делать больше ничего не
надо.
public void delByValue(int delValue) {
while (head != null) {
if (head.data == delValue) {
head = head.next;
} else {
break;
}
}
if (head == null) {
return;
}
//логика удаления не из головы списка
}
Логику удаления не из головы списка мы уже разобрали. Единственное,
что надо помнитьчто удаление элемента ведет к «приближению» остальных
элементов. Поэтому, как и в массивах, в случае удаления элемента не надо
перемещаться на следующий элемент. Поэтому в виде кода материализация
будет следующая:
public void delByValue(int delValue) {
while (head != null) {
if (head.data == delValue) {
head = head.next;
} else break;
}
if (head == null) return;
ListNode prevNode = head;
while (prevNode.next != null) {
if (prevNode.next.data != delValue) {
prevNode = prevNode.next;
continue;
}
prevNode.next = prevNode.next.next;
}
}