Скопируйте данные следующего узла в доступный и удалите следующий узел. Для 4 → 1 → 3 получится 4 → 3, но физически удалится прежний узел со значением 3.
Удаление конкретного элемента из односвязного списка, имея доступ только к нему
Скопируйте данные следующего узла в доступный и удалите следующий узел. Для 4 → 1 → 3 получится 4 → 3, но физически удалится прежний узел со значением 3.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан односвязный список: 4 → 1 → 3. Имеется возможность обратиться лишь к узлу, в котором хранится значение 1. Нужно удалить этот узел, не имея ссылки на предыдущий (со значением 4), чтобы в результате получился список 4 → 3.
struct ListNode {
int data;
ListNode* nxt;
};
// доступен только указатель ListNode* target, где target->data == 1
void deleteNode(ListNode* target) {
// реализовать
}
Ответ
Скопируйте данные следующего узла в доступный и удалите следующий узел. Для 4 → 1 → 3 получится 4 → 3, но физически удалится прежний узел со значением 3.
void deleteNode(ListNode* target) {
if (!target || !target->nxt)
throw std::invalid_argument("non-tail node required");
ListNode* next = target->nxt;
target->data = next->data;
target->nxt = next->nxt;
delete next;
}
Нужен . Предполагается, что узлы выделены через new и принадлежат списку. Приём не подходит для последнего узла и не сохраняет идентичность узлов: внешние ссылки на следующий узел станут недействительными.