[Brosse Leetcode avant-dernier journal de question] n noeuds Task11- supprimer la liste

Titre description

Étant donné une liste, la liste de suppression avant-dernier n noeuds et le noeud de tête retourne la liste

Compte tenu de la liste: 1-> 2-> 3-> 4-> 5 et n = 2.
Après enlevé lorsque le nœud avant - dernier, la liste devient 1-> 2-> 3-> 5.

idées de résolution de problèmes

  • Si ce problème ne se sentent il est assez simple, parce que nous pouvons calculer la longueur du cycle dans la liste, puis trouver l'élément que vous souhaitez supprimer, supprimer très bien, ce qui devrait être un problème de résolution de deux étapes idées, la première étape consiste à calculer la longueur de la liste, la deuxième étape consiste à supprimer l'avant-dernier n éléments, au cours d'un lieu problématique est le n-ième élément de notre nombre positif réciproque de ce afin de ne pas faire des erreurs que nous pouvons posséder écrire plusieurs listes pour trouver la loi juste bel exemple
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int length = 0;
        ListNode* temp = head;
        while(temp != NULL){
            temp = temp -> next;
            length++;
        }//首先利用循环计算出链表的长度,注意这里length是从1开始的
        if(n == length){
            return head -> next;
        }//当n == length时实际上就是删除第一个节点,所以我们要返回的头节点实际上就是原来头结点的下一个结点
        int m = length - n - 1;//我们利用规律,倒数第n个实际上就是正数的第length - n - 1个
        ListNode* pre = head;
        ListNode* cur = head -> next;
        while(m > 0){
            pre = pre -> next;
            cur = cur -> next;
            m--;
        }
        pre -> next = cur -> next;
        return head;
    }
};

Insérer ici l'image Description

optimisation du code

  • En fait, l'amélioration d'un code, et trouver directement les éléments de la liste que nous voulons supprimer le supprimer lui directement, le laisser sur un point de nœud directement à son nœud suivant

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(head == NULL || head -> next == NULL)
        return NULL;
        ListNode* temp = head;
        int length = 0;
        while(temp != NULL){
            temp = temp -> next;
            length++;
        }
        if(n == length){
            head = head -> next;
            return head;
        }
        temp = head;
        for(int m = length - n - 1;m > 0;m--)
        temp = temp -> next;
        temp -> next = temp -> next -> next;
        return head;
    }
};

Insérer ici l'image Description

problème solution

  • Rechercher une autre solution à un problème en regardant le programme, nous l'avons trouvé une solution haut de gamme relativement, à deux mains
Publié 45 articles originaux · louange gagné 2 · Vues 1248

Je suppose que tu aimes

Origine blog.csdn.net/soulmate______/article/details/104803375
conseillé
Classement