Programa de Python para ordenar una lista enlazada de 0, 1 y 2 cambiando los enlaces

Dada una lista enlazada de 0, 1 y 2, ordénela.
Ejemplos:

Input: 2->1->2->1->1->2->0->1->0
Output: 0->0->1->1->1->1->2->2->2
The sorted Array is 0, 0, 1, 1, 1, 1, 2, 2, 2.

Input: 2->1->0
Output: 0->1->2
The sorted Array is 0, 1, 2

Método 1: hay una solución discutida en la publicación a continuación que funciona cambiando los datos de los Nodes. 
Ordenar una lista enlazada de 0, 1 y 2
La solución anterior no funciona cuando estos valores tienen datos asociados con ellos. 
Por ejemplo, estos tres representan tres colores y diferentes tipos de objetos asociados con los colores y clasifican los objetos (conectados con una lista vinculada) en función de los colores.

Método 2: en esta publicación, se analiza una nueva solución que funciona cambiando los enlaces.
Enfoque: Iterar a través de la lista enlazada. Mantenga 3 punteros llamados cero, uno y dos para apuntar a los Nodes finales actuales de las listas vinculadas que contienen 0, 1 y 2 respectivamente. Para cada Node recorrido, lo adjuntamos al final de su lista correspondiente. Finalmente, vinculamos las tres listas. Para evitar muchas verificaciones nulas, usamos tres punteros ficticios zeroD, oneD y twoD que funcionan como encabezados ficticios de tres listas.

Python3

# Python3 Program to sort a linked list 
# 0s, 1s or 2s by changing links
import math
  
# Link list node 
class Node: 
    def __init__(self, data): 
        self.data = data 
        self.next = None
  
#Node* newNode( data)
  
# Sort a linked list of 0s, 1s 
# and 2s by changing pointers.
def sortList(head):
    if (head == None or 
        head.next == None):
        return head
  
    # Create three dummy nodes to point 
    # to beginning of three linked lists. 
    # These dummy nodes are created to 
    # avoid many None checks.
    zeroD = Node(0)
    oneD = Node(0)
    twoD = Node(0)
  
    # Initialize current pointers for 
    # three lists and whole list.
    zero = zeroD 
    one = oneD 
    two = twoD
  
    # Traverse list
    curr = head
    while (curr):
        if (curr.data == 0):
            zero.next = curr
            zero = zero.next
            curr = curr.next
        elif(curr.data == 1):
            one.next = curr
            one = one.next
            curr = curr.next
        else:
            two.next = curr
            two = two.next
            curr = curr.next
          
    # Attach three lists
    zero.next = (oneD.next) if (oneD.next) 
                            else (twoD.next)
    one.next = twoD.next
    two.next = None
  
    # Updated head
    head = zeroD.next
  
    # Delete dummy nodes
    return head
  
# Function to create and return 
# a node
def newNode(data):
      
    # Allocating space
    newNode = Node(data)
  
    # Inserting the required data
    newNode.data = data
    newNode.next = None
    return newNode
  
# Function to print linked list 
def prList(node):
    while (node != None):
        print(node.data, end = " ")
        node = node.next
      
# Driver Code
if __name__=='__main__':
      
    # Creating the list 1.2.4.5
    head = newNode(1)
    head.next = newNode(2)
    head.next.next = newNode(0)
    head.next.next.next = newNode(1)
  
    print("Linked List Before Sorting")
    prList(head)
  
    head = sortList(head)
  
    print("Linked List After Sorting")
    prList(head)
# This code is contributed by Srathore

Producción : 

Linked List Before Sorting
1  2  0  1  
Linked List After Sorting
0  1  1  2  

Análisis de Complejidad: 

  • Complejidad de tiempo: O(n) donde n es un número de Nodes en la lista enlazada. 
    Solo se necesita un recorrido de la lista enlazada.
  • Espacio Auxiliar: O(1). 
    Como no se requiere espacio adicional.

Consulte el artículo completo sobre Ordenar una lista enlazada de 0, 1 y 2 cambiando los enlaces 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 *