Programa de Python para clonar una lista vinculada con el puntero siguiente y 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.

Python3

# Python3 program to clone a linked list 
# with random pointers 
class Node: 
    def __init__(self, data):
          
        # Node Data
        self.data = data 
          
        # Node Next
        self.next = None 
          
        # Node Random
        self.random = None 
  
# Dictionary
class MyDictionary(dict): 
  
    # __init__ function
    def __init__(self):
          
        super().__init__()
        self = dict()
  
        # Function to add key:value
        def add(self, key, value):
          
        # Adding Values to dictionary
        self[key] = value 
  
# Linked list class 
class LinkedList:
      
    # Linked list constructor
    def __init__(self, node):
        self.head = node
  
    # Method to print the list.
    def __repr__(self):
          
        temp = self.head
        while temp is not None:
            random = temp.random
            random_data = (random.data if 
                           random is not None else -1)
                             
            data = temp.data
            print(f"Data-{data}, 
                  Random data: {random_data}")
            temp = temp.next
              
        return ""
  
    # Push method to put data always at 
    # the head in the linked list.
    def push(self, data):
          
        node = Node(data)
        node.next = self.head
        self.head = node
  
    # Actual clone method which returns head
    # reference of cloned linked list.
    def clone(self):
          
        # Initialize two references, one 
        # with original list's head.
        original = self.head
        clone = None
  
        # Initialize two references, one 
        # with original list's head.
        mp = MyDictionary()
  
        # Traverse the original list and 
        # make a copy of that
        # in the clone linked list
        while original is not None:
            clone = Node(original.data)
            mp.add(original, clone)
            original = original.next
  
        # Adjusting the original 
        # list reference again.
        original = self.head
  
        # Traversal of original list again
        # to adjust the next and random 
        # references of clone list using hash map.
        while original is not None:
            clone = mp.get(original)
            clone.next = mp.get(original.next)
            clone.random = mp.get(original.random)
            original = original.next
              
        # Return the head reference of the clone list.
        return LinkedList(self.head)
  
# Driver code
  
# Pushing data in the linked list.
l = LinkedList(Node(5))
l.push(4)
l.push(3)
l.push(2)
l.push(1)
  
# Setting up random references.
l.head.random = l.head.next.next
l.head.next.random = 
l.head.next.next.next
l.head.next.next.random = 
l.head.next.next.next.next
l.head.next.next.next.random = 
(l.head.next.next.next.next.next)
l.head.next.next.next.next.random = 
l.head.next
  
# Making a clone of the 
# original linked list.
clone = l.clone()
  
# Print the original and cloned
# linked list.s
print("Original linked list")
print(l)
print("Cloned linked list")
print(clone)
# This code is contributed by ashwinathappan

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 *