[Leetcode] 92. Reverse-linked-list-ii (analogique) [moyen]

lien

https://leetcode-cn.com/problems/reverse-linked-list-ii/

long

Résolution de problèmes: 1 h 12 min
Résolution de problèmes: 8 min

Titre

Inversez la liste chaînée de la position m à n. Veuillez utiliser une analyse pour terminer l'annulation.

La description:

  • 1 ≤ m ≤ n ≤ longueur de la liste chaînée.

Idées

Définissez un nœud left_before avant le nœud de début du flip, et un nœud right_next après le nœud de fin du flip, et placez continuellement le nœud suivant du nœud gauche actuel après left_before jusqu'à ce que right_next soit rencontré.

Complexité temporelle: O (n) O (n)O ( n )

Code AC

/**
 * 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* reverseBetween(ListNode* head, int left, int right) {
    
    
        ListNode* dummy_head = new ListNode(-1, head);
        
        ListNode* left_node = dummy_head;
        ListNode* left_bef_node = dummy_head;
        for(int i = 0; i < left-1; ++i) left_bef_node = left_bef_node->next;
        left_node = left_bef_node->next;
        ListNode* right_node = dummy_head;
        for(int i = 0; i < right; ++i) right_node = right_node->next;
        ListNode* right_nex_node = right_node->next;
        
        ListNode* now = left_node->next;
        while(now != right_nex_node) {
    
    
            left_node->next = now->next;
            now->next = left_bef_node->next;
            left_bef_node->next = now;
            now = left_node->next;
        }
        
        return dummy_head->next;
    }
};

Je suppose que tu aimes

Origine blog.csdn.net/Krone_/article/details/114969452
conseillé
Classement