Programa C++ para clonar una lista vinculada con el siguiente y puntero aleatorio – Conjunto 2

Ya hemos discutido 2 formas diferentes de clonar una lista enlazada. En esta publicación, se analiza otro método simple para clonar una lista vinculada.

La idea es usar Hashing. A continuación se muestra el algoritmo. 

  1. Recorra la lista enlazada original y haga una copia en términos de datos.
  2. Cree un mapa hash del par de valores clave con el Node de lista enlazada original y el Node de lista enlazada copiado.
  3. Recorra la lista enlazada original nuevamente y, utilizando el mapa hash, ajuste la referencia siguiente y aleatoria de los Nodes de la lista enlazada clonados.

A continuación se muestra la implementación del enfoque anterior.

C++

// C++ program to clone a linked list 
// with random pointers
#include<bits/stdc++.h>
using namespace std;
  
// Linked List Node
class Node
{
    public:
  
    // Node data
    int data;
      
    // Next and random reference
    Node *next, *random;
  
    Node(int data)
    {
        this->data = data;
        this->next = 
        this->random = NULL;
    }
};
  
// Linked list class
class LinkedList
{
    public:
  
    // Linked list head reference
    Node *head;
  
    LinkedList(Node *head)
    {
        this->head = head;
    }
  
    // Push method to put data always at
    // the head in the linked list.
    void push(int data)
    {
        Node *node = new Node(data);
        node->next = head;
        head = node;
    }
  
    // Method to print the list.
    void print()
    {
        Node *temp = head;
        while (temp != NULL)
        {
            Node *random = temp->random;
            int randomData = ((random != NULL) ?
                               random->data : -1);
            cout << "Data = " << 
                    temp->data << ", ";
            cout << "Random Data = " << 
                     randomData << endl;
            temp = temp->next;
        }
        cout << endl;
    }
  
    // Actual clone method which returns
    // head reference of cloned linked
    // list.
    LinkedList* clone()
    {
        // Initialize two references,
        // one with original list's head.
        Node *origCurr = head;
        Node *cloneCurr = NULL;
  
        // Hash map which contains node 
        // to node mapping of original 
        // and clone linked list.
        unordered_map<Node*, Node*> mymap;
  
        // Traverse the original list and
        // make a copy of that in the 
        // clone linked list.
        while (origCurr != NULL)
        {
            cloneCurr = new Node(origCurr->data);
            mymap[origCurr] = cloneCurr;
            origCurr = origCurr->next;
        }
  
        // Adjusting the original list 
        // reference again.
        origCurr = head;
  
        // Traversal of original list again
        // to adjust the next and random 
        // references of clone list using 
        // hash map.
        while (origCurr != NULL)
        {
            cloneCurr = mymap[origCurr];
            cloneCurr->next = 
            mymap[origCurr->next];
            cloneCurr->random = 
            mymap[origCurr->random];
            origCurr = origCurr->next;
        }
  
        // return the head reference of 
        // the clone list.
        return new LinkedList(mymap[head]);
    }
};
  
// Driver code
int main()
{
    // Pushing data in the linked list.
    LinkedList *mylist = 
                new LinkedList(new Node(5));
    mylist->push(4);
    mylist->push(3);
    mylist->push(2);
    mylist->push(1);
  
    // Setting up random references.
    mylist->head->random = 
    mylist->head->next->next;
  
    mylist->head->next->random =
    mylist->head->next->next->next;
  
    mylist->head->next->next->random =
    mylist->head->next->next->next->next;
  
    mylist->head->next->next->next->random =
    mylist->head->next->next->next->next->next;
  
    mylist->head->next->next->next->next->random =
    mylist->head->next;
  
    // Making a clone of the original
    // linked list.
    LinkedList *clone = mylist->clone();
  
    // Print the original and cloned 
    // linked list.
    cout << "Original linked list";
    mylist->print();
    cout << "Cloned linked list";
    clone->print();
}
// This code is contributed by Chhavi

Producción: 

Original linked list
Data = 1, Random data = 3
Data = 2, Random data = 4
Data = 3, Random data = 5
Data = 4, Random data = -1
Data = 5, Random data = 2

Cloned linked list
Data = 1, Random data = 3
Data = 2, Random data = 4
Data = 3, Random data = 5
Data = 4, Random data = -1
Data = 5, Random data = 2

Complejidad de tiempo: O(n) 
Espacio auxiliar : O(n)
Consulte el artículo completo sobre Clonar una lista enlazada con puntero siguiente y aleatorio | Set 2 para más detalles!

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *