Programa de Python para clonar una lista vinculada con el puntero siguiente y aleatorio en el espacio O (1)

Dada una lista enlazada que tiene dos punteros en cada Node. El primero apunta al siguiente Node de la lista, sin embargo, el otro puntero es aleatorio y puede apuntar a cualquier Node de la lista. Escriba un programa que clone la lista dada en el espacio O(1), es decir, sin ningún espacio adicional. 
Ejemplos: 
 

Input : Head of the below-linked list

Output :
A new linked list identical to the original list.

En las publicaciones anteriores, Set-1 y Set-2 se analizan varios métodos, y también está disponible la implementación de la complejidad del espacio O(n).
En esta publicación, implementaremos un algoritmo que no requerirá espacio adicional, como se explicó en el Conjunto 1.
A continuación se muestra el algoritmo: 
 

  • Cree la copia del Node 1 e insértela entre el Node 1 y el Node 2 en la lista enlazada original, cree una copia del 2 e insértela entre el 2 y el 3. Continúe de esta manera, agregue la copia de N después del enésimo Node 
     
  • Ahora copie el enlace aleatorio de esta manera 
     
 original->next->random= original->random->next;  /*TRAVERSE 
TWO NODES*/
  • Esto funciona porque original->siguiente no es más que una copia del original y Original->aleatorio->siguiente no es más que una copia del azar. 
     
  • Ahora restaure las listas enlazadas originales y copie de esta manera en un solo ciclo. 
     
original->next = original->next->next;
     copy->next = copy->next->next;
  • Asegúrese de que original->next sea NULL y devuelva la lista clonada

A continuación se muestra la implementación. 
 

Python

'''Python program to clone a linked list with next and arbitrary pointers'''
'''Done in O(n) time with O(1) extra space'''
 
class Node:
    '''Structure of linked list node'''
 
    def __init__(self, data):
        self.data = data
        self.next = None
        self.random = None
 
def clone(original_root):
    '''Clone a doubly linked list with random pointer'''
    '''with O(1) extra space'''
 
    '''Insert additional node after every node of original list'''
    curr = original_root
    while curr != None:
        new = Node(curr.data)
        new.next = curr.next
        curr.next = new
        curr = curr.next.next
 
    '''Adjust the random pointers of the newly added nodes'''
    curr = original_root
    while curr != None:
        curr.next.random = curr.random.next
        curr = curr.next.next
 
    '''Detach original and duplicate list from each other'''
    curr = original_root
    dup_root = original_root.next
    while curr.next != None:
        tmp = curr.next
        curr.next = curr.next.next
        curr = tmp
 
    return dup_root
 
def print_dlist(root):
    '''Function to print the doubly linked list'''
 
    curr = root
    while curr != None:
        print('Data =', curr.data, ', Random =', curr.random.data)
        curr = curr.next
 
####### Driver code #######
'''Create a doubly linked list'''
original_list = Node(1)
original_list.next = Node(2)
original_list.next.next = Node(3)
original_list.next.next.next = Node(4)
original_list.next.next.next.next = Node(5)
 
'''Set the random pointers'''
 
# 1's random points to 3
original_list.random = original_list.next.next
 
# 2's random points to 1
original_list.next.random = original_list
 
# 3's random points to 5
original_list.next.next.random = original_list.next.next.next.next
 
# 4's random points to 5
original_list.next.next.next.random = original_list.next.next.next.next
 
# 5's random points to 2
original_list.next.next.next.next.random = original_list.next
 
'''Print the original linked list'''
print('Original list:')
print_dlist(original_list)
 
'''Create a duplicate linked list'''
cloned_list = clone(original_list)
 
'''Print the duplicate linked list'''
print('
Cloned list:')
print_dlist(cloned_list)
 
'''This code is contributed by Shashank Singh'''
Producción

Original list : 
Data = 1, Random  = 3
Data = 2, Random  = 1
Data = 3, Random  = 5
Data = 4, Random  = 5
Data = 5, Random  = 2

Cloned list : 
Data = 1, Random  = 3
Data = 2, Random  = 1
Data = 3, Random  = 5
Data = 4, Random  = 5
Data = 5, Random  = 2

Complejidad de tiempo: O(n), donde n es el número de Nodes en la lista enlazada dada.

Espacio Auxiliar: O(1), ya que no se utiliza espacio extra. Los n Nodes que se insertan entre los Nodes ya se requerían para clonar la lista, por lo que podemos decir que no usamos ningún espacio adicional.

¡ Consulte el artículo completo sobre Clonar una lista enlazada con el puntero siguiente y aleatorio en el espacio O (1) para obtener 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 *