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

UptoLike

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

88
Пусть мы нашли наш элемент (который находится перед удаляемым).
Назовем его prevNode. Тогда очевидно, что в элементе, который после него
(prevNode.next), находится удаляемое данное (prevNode.next.data == delValue).
Как уже говорилось, это удаление не из головы. Поэтому prevNode всегда
существует. Но и precNode.next должен существовать, что бы
prevNode.next.data имело смысл. Поэтому в виде псевдокода алгоритм поиска
будет следующий:
Объявить переменную для предыдущего узла (prevNode)
Инициализировать ее головой.
Пока следующий элемент за prevNode существует
НачалоЦикла
Если в след. элементе после prevNode находится удаляемое данное, то
НачалоЕсли
Переставить next в prevNode на следующий узел после удаляемого.
Прервать цикл
ОкончаниеЕсли
Иначе
НачалоИначе
Перейти на следующий элемент.
ОкончаниеИначе
ОкончаниеЦикла
Первый шаг реализации будет иметь следующий вид:
public void delNotFromHead(int delValue) {
ListNode prevNode = head;
while (prevNode.next != null) {
if (prevNode.next.data == delValue) {
ListNode delNode = prevNode.next;
prevNode.next = delNode.next;
return;
} else {
prevNode = prevNode.next;
}
}
}
Но его можно оптимизировать по сложности кода, инвертировав условие.
public void delNotFromHead(int delValue) {
ListNode prevNode = head;
while (prevNode.next != null) {
if (prevNode.next.data != delValue) {
prevNode = prevNode.next;
continue;
}
ListNode delNode = prevNode.next;
prevNode.next = delNode.next;
return;
}
}