Удаление конкретного элемента из односвязного списка, имея доступ только к нему

Скопируйте данные следующего узла в доступный и удалите следующий узел. Для 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 и принадлежат списку. Приём не подходит для последнего узла и не сохраняет идентичность узлов: внешние ссылки на следующий узел станут недействительными.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее