Programa Java 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.

Java

// Java Program to sort a linked list 
// 0s, 1s or 2s by changing links 
public class Sort012 
{
    // Sort a linked list of 0s, 1s 
    // and 2s by changing pointers.
    public static Node sortList(Node head)
    {
        if(head==null || head.next==null)
        {
            return head;
        }
  
        // Create three dummy nodes to point to 
        // beginning of three linked lists. These 
        // dummy nodes are created to avoid many 
        // null checks. 
        Node zeroD = new Node(0); 
        Node oneD = new Node(0); 
        Node twoD = new Node(0); 
  
        // Initialize current pointers for three 
        // lists and whole list. 
        Node zero = zeroD, one = oneD, two = twoD; 
        // Traverse list 
        Node curr = head; 
        while (curr!=null) 
        { 
            if (curr.data == 0) 
            { 
                zero.next = curr; 
                zero = zero.next; 
                curr = curr.next; 
            }
            else if (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!=null) ? 
                    (oneD.next) : (twoD.next); 
        one.next = twoD.next; 
        two.next = null;
  
        // Updated head 
        head = zeroD.next;
        return head;
    }
  
    // Function to create and return a node 
    public static Node newNode(int data) 
    { 
        // Allocating space 
        Node newNode = new Node(data);
        newNode.next = null; 
        return newNode;
    } 
    
    // Function to print linked list 
    public static void printList(Node node) 
    { 
        while (node != null) 
        { 
            System.out.print(node.data+" ");
            node = node.next; 
        } 
    }
  
    Driver code
    public static void main(String args[]) 
    {
        Node head = new Node(1); 
        head.next = new Node(2); 
        head.next.next = new Node(0); 
        head.next.next.next = new Node(1);
        System.out.println(
        "Linked List Before Sorting");
        printList(head); 
        head = sortList(head);  
        System.out.println(
        "Linked List After Sorting");
        printList(head); 
    }
}
  
class Node
{
    int data;
    Node next;
    Node(int data)
    {
        this.data=data;
    }
}
//This code is contributed by Gaurav Tiwari

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 *