Sword Finger - Copia de lista enlazada compleja - Copia profunda/HashMap

Tema Descripción

Ingrese una lista vinculada compleja (cada nodo tiene un valor de nodo y dos punteros, uno apunta al siguiente nodo y el otro puntero especial apunta aleatoriamente a un nodo aleatorio), haga una copia profunda de esta lista vinculada y devuelva la copia punto de cabecera. (Nota, no devuelva la referencia del nodo en el parámetro en el resultado de salida, de lo contrario, el programa de evaluación volverá vacío directamente)

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

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

tren de pensamiento

1. Crear HashMap
2. Copiar valor de nodo
3. Copiar punto (siguiente, aleatorio)

el código

/*
public class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}
*/

import java.util.HashMap;

public class Solution {
    
    
    public RandomListNode Clone(RandomListNode pHead)
    {
    
    
        HashMap<RandomListNode,RandomListNode> map = new HashMap<>();
        RandomListNode cur = pHead;
        
        while(cur!=null){
    
    
            map.put(cur, new RandomListNode(cur.label));
            cur = cur.next;
        }
        
        cur = pHead;
        while(cur!=null){
    
    
            map.get(cur).next = map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
            cur = cur.next;
        }
        return map.get(pHead);
    }
}

Copiar en JAVA

copia de objeto

  • "=" se pasa por valor para tipos de datos básicos ;
    "=" se pasa por referencia para objetos .

copia superficial

  • Los tipos de datos básicos, la modificación del valor del atributo no se afectan entre sí;
    los tipos de referencia, la asignación de direcciones de memoria, se afectarán entre sí.

copia profunda

  • Los tipos de datos básicos, al igual que la copia superficial, no tienen ningún efecto.
    Tipo de referencia, espacio de memoria recién creado, contenido de copia, no se afectan entre sí.
    Para objetos multicapa, cada objeto debe implementar Cloneable y reescribir el método clone(), que llama a super.clone().
Anular el método de clonación
    @Override
    protected Object clone() throws CloneNotSupportedException {
    
    
        //浅拷贝,直接调用父类的clone()方法
        return super.clone();
    }
El objeto maestro anula el método de clonación
    @Override
    protected Object clone() throws CloneNotSupportedException {
    
    
        //浅拷贝,直接调用父类的clone()方法
        Student student = (Student) super.clone();
        student.subject = (Subject) subject.clone();
        return student;
    }

рекомендация

отblog.csdn.net/qq_32301683/article/details/108956257
рекомендация