Рубрики
Без рубрики

Решение: удалить NT-узел От конца списка

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ

Проблема лецкода № 19 (средний): удалить NT-узел От конца списка

Описание:

( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++

Учитывая голова связанного списка, удалите n узел с конца списка и вернуть его голова Отказ

Продолжайте : Не могли бы вы сделать это в одном проходе?

Примеры:

Вход: голова = [1,2,3,4,5],
Вывод: [1,2,3,5]
Визуальный
Вход: голова = [ 1],
Вывод: []
Вход: голова = [ 1,2],
Вывод: [1]

Ограничения:

  • Количество узлов в списке – SZ Отказ
  • 1
  • 0.Паль
  • 1

Идея:

( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++

С отдельно связанным списком, Только способ найти конец списка, и, таким образом, n «Узел с конца, это фактически повторять до конца. Задача здесь пытается найти решение только в одном проходе. Наивный подход здесь может быть хранить указатели на каждый узел в массиве, что позволяет нам рассчитать n «От конца после того, как мы достигнем конца, но это займет O (m) дополнительное пространство , где М это длина связанного списка.

Чуть менее наивный подход будет только хранить только последнее N + 1 Указатели узла в массиве. Это может быть достигнуто путем перезаписи элементов массива хранения в круговой моде, как мы повторяем через список. Это будет снизить бы Космическая сложность к O (n + 1) Отказ

Для того, чтобы решить эту проблему только в одном проходе и O (1) дополнительное пространство Однако нам нужно было найти способ оба Достигните конец списка одним указателем а также добраться до n Узел с конца одновременно со вторым указателем.

Для этого мы можем просто потемнеть наши два указателя по n Узлы, давая первый указатель ( быстрая ) начало головы перед запуском второго указателя ( медленно ). Это приведет к тому, что сделает медленно добраться до n Узел с конца в то же время, что быстро достигает конца.

Так как нам понадобится доступ к узлу до Целевой узел для удаления целевого узла мы можем использовать fast.next как наше условие выхода, а не быстро Так что мы остановим одно узел ранее.

Это, к сожалению, вызывает проблему, когда n такое же, как длина списка, которая сделает первый узел целевой узел, и, таким образом, делает невозможным найти узел до целевой узел. Если это так, однако, мы можем просто Вернуть голову .следует без необходимости вышивать вместе две стороны целевого узла.

В противном случае, как только мы успешно найдем узел до Цель, мы можем затем прошить его вместе с узлом после цель, а затем Вернуть голову Отказ

Выполнение:

Между кодом всех четырех языков есть только незначительные различия.

Код JavaScript:

( Перейти к : Описание проблемы Идея решения

var removeNthFromEnd = function(head, n) {
    let fast = head, slow = head
    for (let i = 0; i < n; i++) fast = fast.next
    if (!fast) return head.next
    while (fast.next) fast = fast.next, slow = slow.next
    slow.next = slow.next.next
    return head
};

Код Python:

( Перейти к : Описание проблемы Идея решения

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        fast, slow = head, head
        for _ in range(n): fast = fast.next
        if not fast: return head.next
        while fast.next: fast, slow = fast.next, slow.next
        slow.next = slow.next.next
        return head

Java код:

( Перейти к : Описание проблемы Идея решения

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode fast = head, slow = head;
        for (int i = 0; i < n; i++) fast = fast.next;
        if (fast == null) return head.next;
        while (fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return head;
    }
}

C ++ код:

( Перейти к : Описание проблемы Идея решения

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *fast = head, *slow = head;
        for (int i = 0; i < n; i++) fast = fast->next;
        if (!fast) return head->next;
        while (fast->next) fast = fast->next, slow = slow->next;
        slow->next = slow->next->next;
        return head;
    }
};

Оригинал: “https://dev.to/seanpgallivan/solution-remove-nth-node-from-end-of-list-4njl”