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:
- Copie cada nodo primero y colóquelo detrás del nodo
- 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)
- 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;
}
};