leetcode 19. Удалить последний N узел связанного списка (приложение с двойным указателем)

Учитывая связанный список, удалите последний n-й узел связанного списка и верните головной узел связанного списка.

Пример 1:
Ввод: голова = [1,2,3,4,5], n = 2

вставьте сюда описание изображения

Вывод: [1,2,3,5]

Пример 2:
Ввод: голова = [1], n = 1
Вывод: []

Пример 3:
Ввод: голова = [1,2], n = 1
Вывод: [1]

намекать:

Количество узлов в связанном списке равно sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

Расширенный: Лучше всего реализовать сканирование за один проход.

Идея:
используйте двойные указатели для обхода только один раз.
Обычная идея состоит в том, чтобы пройти один раз, чтобы получить общее количество узлов в связанном списке, затем пройти, чтобы найти предыдущий узел, который нужно удалить в соответствии со значением n, и работать со следующим указателем предыдущего узла.

Используя быстрый и медленный указатели, вы можете позволить быстрому указателю двигаться вперед на n шагов.Когда быстрый указатель достигает удаляемого узла, быстрый и медленный указатели перемещаются вперед одновременно, указывая на следующий узел. указатель достигает последнего узла, условие оценки — fast- >next==NULL , выход из цикла, а положение медленного указателя — это предыдущее положение удаляемого узла.

Конечно, мы также должны учитывать особые обстоятельства. Например, если есть только один узел, вернуть NULL. Если первый узел должен быть удален, конечный быстрый указатель должен указывать на следующий из последних узлов, то есть NULL .

код:

С++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
    
    
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
    
    
        ListNode *slow=head,*fast=head;
        if(!head&&!head->next)
            return NULL;
        for(int i=0;i<n;++i)
            fast=fast->next;
        if(!fast)
            return head->next;
        while(fast->next){
    
      //用fast->next判断是不是最后一个结点
            slow=slow->next;
            fast=fast->next;
        }
        slow->next=slow->next->next;
        return head;
    }
};

Джава

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    
    
    public ListNode removeNthFromEnd(ListNode head, int n) {
    
    
        if(head==null&&head.next==null)
            return null;
        ListNode slow=head,fast=head;
        for(int i=0;i<n;++i)
            fast=fast.next;
        if(fast==null)
            return head.next;
        while(fast.next!=null){
    
    
            slow=slow.next;
            fast=fast.next;
        }
        slow.next=slow.next.next;
        return head;
    }
}


Supongo que te gusta

Origin blog.csdn.net/xiatutut/article/details/127160474
Recomendado
Clasificación