Что ж, чтобы эта статья была простой и краткой, я не буду подробно объяснять каждый случай, особенно когда вам нужно удалить данное значение из связанного списка. Это легче решить, особенно когда вам нужно удалить первое вхождение данного значения, но становится сложнее, когда нужно удалить несколько вхождений.

Итак, вот решение, которое я разрабатываю, которое охватывает каждый отдельный случай и прошло все тестовые случаи.

Решение разделено на два этапа, давайте сначала поговорим о втором этапе, потому что понимание второго этапа помогает нам понять, зачем нам нужен первый этап.

Идея проста, сохраняйте двухстрелочные «f» и «b». «f» отслеживает текущий узел, а «b» отслеживает предыдущий узел. Если «f» указывает на интересующее значение, пропустите его и сделайте так, чтобы узел «b» указывал на узел «f». Короче говоря, мы удалили это событие. Когда мы доходим до конца, мы удаляем все вхождения. Но эта идея предполагает, что начало списка чистое, то есть в самом начале списка нет вхождений. Например:

head-›1-›1-›1-›2-›3-›4-›null для вхождения 1.

Поэтому, чтобы сделать это предположение верным, нам нужна первая фаза. На первом этапе мы продолжаем пропускать указатель «f», пока он не укажет на значение, которое не является значением для удаления. А затем мы перемещаем голову на текущее значение «f». Итак, у нас есть список, который выглядит так.

голова-›2-›3-›4-›нуль.

Теперь мы можем перейти ко второй фазе, и она выдаст очищенный список, который мы хотели.

Как насчет времени выполнения и использования памяти.

С точки зрения времени выполнения, оно близко к 0 мс, что превосходит 100% отправку java на Leetcode.

Принимая во внимание, что его использование памяти превосходит 75% представления Java, что не впечатляет.

Кстати, если у вас есть лучшее решение, которое использует еще меньше памяти или времени. Или, если у вас есть более конкретное, визуально привлекательное и чистое решение, свяжитесь со мной в LinkedIn. Ссылка внизу👇



или напишите мне по адресу 📨: [email protected]