Новости IT, Tech-лайфхаки & Кодинг

Решение задачи #19. Python LeetCode, Remove nth node from end of list

Опубликовано: 03.05.2025, 17:37 | Автор: HDHai

Задача на алгоритм для работы со связным списком в Python. Требуется удалить N-й узел с конца односвязного списка, сохранив структуру данных. Задача проверяет умение эффективно манипулировать связными списками с использованием алгоритма двух указателей (fast and slow), который решает проблему за один проход без дополнительной памяти.


Вариант решения задачи на Python с LeetCode

Категория: Алгоритмы.
Название задачи: Remove nth node from end of list.
Сложность: Средняя.
Статус решения: "Решено".

Условие задачи:
Given the head of a linked list, remove the nth node from the end of the list and return its head.

Решение:


Python

# Определение узла связного списка
class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution(object):
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        # Создаем фиктивный узел, чтобы упростить удаление первого элемента
        dummy = ListNode(0)
        dummy.next = head
        
        # Инициализируем два указателя: fast и slow
        fast = dummy
        slow = dummy
        
        # Перемещаем fast на n узлов вперед
        for _ in range(n + 1):
            fast = fast.next
        
        # Перемещаем fast до конца списка, slow будет отставать на n узлов
        while fast is not None:
            slow = slow.next
            fast = fast.next
        
        # Удаляем n-й узел с конца
        slow.next = slow.next.next
        
        # Возвращаем новый head списка (исключая фиктивный узел)
        return dummy.next

Объяснение кода


Фиктивный узел (dummy):
Используется для упрощения обработки случая, когда нужно удалить первый элемент списка.
dummy.next указывает на head списка.

Два указателя (fast и slow):
fast сначала перемещается на n + 1 шагов вперед, чтобы между fast и slow образовался разрыв в n узлов.
Затем оба указателя двигаются вместе, пока fast не достигнет конца списка.
В этот момент slow окажется перед узлом, который нужно удалить.

Удаление узла:
Когда slow находится перед n-м узлом с конца, мы просто перебрасываем ссылку slow.next через удаляемый узел (slow.next = slow.next.next).
Это исключает узел из списка.

Возврат результата:
Возвращаем dummy.next, так как head мог измениться (если удалялся первый элемент).

Пример работы:
head =
[1,2,3,4,5]

n =
2

Output
[1,2,3,5]

Expected
[1,2,3,5]

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

Источник решения: hdhai.com