Код выглядит нормально, но я бы посоветовал внести небольшие изменения в ваше while
состояние
while(prevNode != currentNode && prevNode != NULL)
По двум причинам
- Ваш код, как указано в настоящий момент, может остановиться, если на искомый узел указывает либо
prevNode
, либо prevNode->link
(и, следовательно, мы не будем знать, какой именно из двух пунктов указывает на currentNode
- если бы мы хотели знать, мы должны были бы проверить с условием if
). С изменением выше, целевой узел гарантированно будет сохранен в prevNode
(если вообще - см. Следующий пункт).
- В целях безопасности было бы хорошо проверить, что
prevNode
не является NULL
. Однако, как упоминает Павел, этот тест не нужен, если currentNode
гарантированно присутствует в списке.
Редактировать в ответ на комментарий
Учитывая, что вам не нужно знать, находится ли currentNode
в prevNode
или prevNode->link
, и, поскольку вы хотите остановиться (если возможно) на currentNode == prevNode->link
, тогда ваш исходный while
в порядке. Однако ...
есть оператор if выше
код, который предотвращает
prevNode
от нуля
уже
Похоже, вам не хватает смысла проверять NULL
. Да, хорошо, что вы проверяли это раньше, но причина, по которой у нас есть проверка NULL
в цикле, заключается в том случае, когда currentNode
означает , а не в списке, поэтому вы в конечном итоге достигаете последнего узла , Предположительно (если вы делаете это, как и большинство других связанных списков), значение link
для вашего последнего узла равно NULL
. Если это так, ваш текущий код в конечном итоге вызовет NULL->link
, что, конечно, приведет к сбою вашей программы. Вот почему вы все равно должны проверить на NULL
while(prevNode != NULL && prevNode != currentNode && prevNode->link!=currentNode)
Если вы абсолютно уверены , что currentNode
будет в списке, тогда я думаю , что проверка также не нужна, но это действительно хорошая привычка, чтобы попасть в .