Programa C++ para ordenar una lista enlazada de 0s, 1s y 2s

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

Input: 1 -> 1 -> 2 -> 0 -> 2 -> 0 -> 1 -> NULL
Output: 0 -> 0 -> 1 -> 1 -> 1 -> 2 -> 2 -> NULL

Input: 1 -> 1 -> 2 -> 1 -> 0 -> NULL 
Output: 0 -> 1 -> 1 -> 1 -> 2 -> NULL

Fuente: Entrevista de Microsoft | Serie 1

Los siguientes pasos se pueden utilizar para ordenar la lista vinculada dada.

  • Recorra la lista y cuente el número de 0, 1 y 2. Sean los conteos n1, n2 y n3 respectivamente.
  • Recorra la lista nuevamente, complete los primeros n1 Nodes con 0, luego n2 Nodes con 1 y finalmente n3 Nodes con 2.

La imagen de abajo es una ejecución en seco del enfoque anterior:

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

C++

// C++ Program to sort a linked list 
// 0s, 1s or 2s 
#include <bits/stdc++.h>
using namespace std;
  
// Link list node 
class Node 
{ 
    public:
    int data; 
    Node* next; 
}; 
  
// Function to sort a linked list 
// of 0s, 1s and 2s 
void sortList(Node *head) 
{ 
    // Initialize count of '0', '1' 
    // and '2' as 0 
    int count[3] = {0, 0, 0}; 
    Node *ptr = head; 
  
    /* Count total number of '0', '1' and '2' 
       count[0] will store total number of '0's 
       count[1] will store total number of '1's 
       count[2] will store total number of '2's */
    while (ptr != NULL) 
    { 
        count[ptr->data] += 1; 
        ptr = ptr->next; 
    } 
  
    int i = 0; 
    ptr = head; 
  
    /* Let say count[0] = n1, count[1] = n2 
       and count[2] = n3.
       Now start traversing list from head node, 
       1) fill the list with 0, till n1 > 0 
       2) fill the list with 1, till n2 > 0 
       3) fill the list with 2, till n3 > 0 */
    while (ptr != NULL) 
    { 
        if (count[i] == 0) 
            ++i; 
        else
        { 
            ptr->data = i; 
            --count[i]; 
            ptr = ptr->next; 
        } 
    } 
} 
  
// Function to push a node
void push (Node** head_ref, 
           int new_data) 
{ 
    // Allocate node 
    Node* new_node = new Node();
  
    // Put in the data 
    new_node->data = new_data; 
  
    // Link the old list off the 
    // new node 
    new_node->next = (*head_ref); 
  
    // Move the head to point to the 
    // new node 
    (*head_ref) = new_node; 
} 
  
// Function to print linked list 
void printList(Node *node) 
{ 
    while (node != NULL) 
    { 
        cout << node->data << " "; 
        node = node->next; 
    } 
    cout << endl; 
} 
  
// Driver code
int main(void) 
{ 
    Node *head = NULL; 
    push(&head, 0); 
    push(&head, 1); 
    push(&head, 0); 
    push(&head, 2); 
    push(&head, 1); 
    push(&head, 1); 
    push(&head, 2); 
    push(&head, 1); 
    push(&head, 2); 
  
    cout << "Linked List Before Sorting"; 
    printList(head); 
  
    sortList(head); 
  
    cout << "Linked List After Sorting"; 
    printList(head); 
  
    return 0; 
} 
// This code is contributed by rathbhupendra

Producción: 

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

Complejidad de tiempo: O(n) donde n es el número de Nodes en la lista enlazada. 
Espacio Auxiliar: O(1)

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