Oferta de Sword Finger Serie Oferta 35 de Sword Finger: Copia de la lista vinculada compleja: Una pregunta muy inteligente, muy recomendable

Descripción del Título:

Implemente la función copyRandomList para copiar una lista vinculada compleja. En una lista vinculada compleja, cada nodo tiene un puntero al siguiente nodo y un puntero aleatorio a cualquier nodo o nulo en la lista vinculada.

Ejemplo 1:

Entrada: cabeza = [[7, nulo], [13,0], [11,4], [10,2], [1,0]]
Salida: [[7, nulo], [13,0], [11,4], [10,2], [1,0]]

Ejemplo 2:

Entrada: cabeza = [[1,1], [2,1]]
Salida: [[1,1], [2,1]]

Ejemplo 3:

Entrada: cabeza = [[3, nulo], [3,0], [3, nulo]]
Salida: [[3, nulo], [3,0], [3, nulo]]

Ejemplo 4:

Entrada: cabeza = []
Salida: []
Explicación: La lista enlazada dada está vacía (puntero nulo), por lo que se devuelve nulo.

Ideas de resolución de problemas:

La idea de esta pregunta es muy inteligente. Mi sensación es que cada uno de los datos que dio tiene dos datos, y el segundo número es confuso. Estos datos no tienen ningún efecto y es imposible encontrar estos datos con código.

Por lo tanto, debe utilizar otros métodos para reemplazar estos datos al resolver el problema:

  1. Copie cada nodo primero y colóquelo detrás del nodo
  2. En este momento, de acuerdo con el aleatorio de cada nodo en la lista vinculada original, encuentre el aleatorio del nodo copiado. (Este paso es la clave)
  3. Separe el nodo copiado y regrese

No hace falta decir que el primer y tercer paso, aquí es cómo obtener el segundo paso, porque es un nuevo nodo casi completamente copiado, por lo que el aleatorio del nodo y recién copiado es el siguiente aleatorio del nodo original x;

Como se muestra en la figura anterior, si el azar de B apunta a A, entonces el azar de B1 debe apuntar a A1;

El método de A1 es B-> aleatorio-> siguiente, que es el valor de B1-> aleatorio.

Código:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(!head) return NULL;
        Node *headx = head;
        //将每个节点复制到他后面
        while(headx)
        {
            auto x = new Node(headx->val);
            x->next = headx->next;
            headx->next = x;
            headx = x->next;
        }

        //将另一个指针也复制一次
        Node *heady = head;
        while(heady && heady->next)
        {
            if(heady->random)
                heady->next->random = heady->random->next;
            heady = heady->next->next;
        }

        //将两个分离
        Node *newhead = head->next;
        Node *headz = head;
        while(headz && headz->next)
        {
            Node *z = headz->next;
            headz->next = z->next;
            headz = z;
        }
        return newhead;
    }
};

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_46423166/article/details/110823410
Recomendado
Clasificación