Разбор задачи: Удаление элементов связанного списка

Предложенный нами код решения:

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

Основные этапы решения

  1. Инициализация фиктивного узла:

    dummy = ListNode(0)
    dummy.next = head
    
    • Создаем фиктивный узел (dummy) с произвольным значением (в данном случае 0), который указывает на текущую голову списка (head).
    • Это делается для упрощения обработки случаев, когда первый узел списка может быть удален. С фиктивным узлом нам не нужно обрабатывать этот случай отдельно.
  2. Инициализация указателя:

    current = dummy
    
    • current — указатель, который используется для обхода списка. Мы начинаем обход с фиктивного узла.
  3. Обход списка:

    while current.next:
    
    • Цикл продолжается до тех пор, пока у текущего узла есть следующий узел (current.next не равен None).
  4. Удаление узлов с заданным значением:

    if current.next.val == val:
        current.next = current.next.next
    
    • Если значение следующего узла (current.next.val) равно val, мы перепрыгиваем через этот узел, перенаправляя указатель current.next на узел, следующий за ним (current.next.next).
    • Этот шаг удаляет узел с заданным значением val из списка.
  5. Переход к следующему узлу:

    else:
        current = current.next
    
    • Если значение текущего узла не равно val, просто переходим к следующему узлу, перемещая указатель current.
  6. Возврат нового списка:

    return dummy.next
    
    • Возвращаем dummy.next, так как dummy был фиктивным узлом и не входит в результирующий список.

Разбор на примере

Пример 1:

Ввод:

head = [1, 2, 6, 3, 4, 5, 6]
val = 6

Шаги:

  1. Список выглядит так:

    dummy -> 1 -> 2 -> 6 -> 3 -> 4 -> 5 -> 6 -> None
    current -> dummy
    
  2. Проверяем узел с val = 6:
    • Узел после 2 удаляется:

      dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> None
      
  3. Проверяем следующий узел с val = 6:
    • Узел после 5 удаляется:

      dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> None
      
  4. Возвращаем список, начиная с dummy.next:

    1 -> 2 -> 3 -> 4 -> 5 -> None
    

Результат:

[1, 2, 3, 4, 5]

Пример 2:

Ввод:

head = []
val = 1

Шаги:

  1. Список пустой:

    dummy -> None
    
  2. Цикл while current.next сразу завершается.
  3. Возвращаем dummy.next, который равен None.

Результат:

[]

Пример 3:

Ввод:

head = [7, 7, 7, 7]
val = 7

Шаги:

  1. Список выглядит так:

    dummy -> 7 -> 7 -> 7 -> 7 -> None
    current -> dummy
    
  2. Проверяем каждый узел:
    • Узлы с val = 7 удаляются один за другим.
  3. В результате список становится пустым:

    dummy -> None
    

Результат:

[]

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии