Программа курса:
Разбор задачи: Удаление элементов связанного списка
Предложенный нами код решения:
def remove_elements(head, val):
"""
Удаляет все узлы из связанного списка, значение которых равно val.
:param head: ListNode, голова связанного списка.
:param val: int, значение для удаления.
:return: ListNode, новая голова связанного списка.
"""
# Создаем фиктивный узел перед началом списка, чтобы упростить обработку первого элемента
dummy = ListNode(0)
dummy.next = head
current = dummy
# Проходим по списку
while current.next:
# Если значение текущего узла равно val, удаляем его
if current.next.val == val:
current.next = current.next.next
else:
current = current.next # Переходим к следующему узлу
# Возвращаем новый список начиная с фиктивного узла
return dummy.nextОсновные этапы решения
Инициализация фиктивного узла:
dummy = ListNode(0) dummy.next = head- Создаем фиктивный узел (
dummy) с произвольным значением (в данном случае0), который указывает на текущую голову списка (head). - Это делается для упрощения обработки случаев, когда первый узел списка может быть удален. С фиктивным узлом нам не нужно обрабатывать этот случай отдельно.
- Создаем фиктивный узел (
Инициализация указателя:
current = dummycurrent— указатель, который используется для обхода списка. Мы начинаем обход с фиктивного узла.
Обход списка:
while current.next:- Цикл продолжается до тех пор, пока у текущего узла есть следующий узел (
current.nextне равенNone).
- Цикл продолжается до тех пор, пока у текущего узла есть следующий узел (
Удаление узлов с заданным значением:
if current.next.val == val: current.next = current.next.next- Если значение следующего узла (
current.next.val) равноval, мы перепрыгиваем через этот узел, перенаправляя указательcurrent.nextна узел, следующий за ним (current.next.next). - Этот шаг удаляет узел с заданным значением
valиз списка.
- Если значение следующего узла (
Переход к следующему узлу:
else: current = current.next- Если значение текущего узла не равно
val, просто переходим к следующему узлу, перемещая указательcurrent.
- Если значение текущего узла не равно
Возврат нового списка:
return dummy.next- Возвращаем
dummy.next, так какdummyбыл фиктивным узлом и не входит в результирующий список.
- Возвращаем
Разбор на примере
Пример 1:
Ввод:
head = [1, 2, 6, 3, 4, 5, 6]
val = 6
Шаги:
Список выглядит так:
dummy -> 1 -> 2 -> 6 -> 3 -> 4 -> 5 -> 6 -> None current -> dummy- Проверяем узел с
val = 6:Узел после
2удаляется:dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> None
- Проверяем следующий узел с
val = 6:Узел после
5удаляется:dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> None
Возвращаем список, начиная с
dummy.next:1 -> 2 -> 3 -> 4 -> 5 -> None
Результат:
[1, 2, 3, 4, 5]
Пример 2:
Ввод:
head = []
val = 1
Шаги:
Список пустой:
dummy -> None- Цикл
while current.nextсразу завершается. - Возвращаем
dummy.next, который равенNone.
Результат:
[]
Пример 3:
Ввод:
head = [7, 7, 7, 7]
val = 7
Шаги:
Список выглядит так:
dummy -> 7 -> 7 -> 7 -> 7 -> None current -> dummy- Проверяем каждый узел:
- Узлы с
val = 7удаляются один за другим.
- Узлы с
В результате список становится пустым:
dummy -> None
Результат:
[]
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии