C++程序 对0、1、2形式的链表进行排序

C++程序 对0、1、2形式的链表进行排序

给出一个由0、1和2组成的链表,请将其排序。

示例:

输入: 1->1->2->0->2->0->1->NULL
输出: 0->0->1->1->1->2->2->NULL

输入: 1->1->2->1->0->NULL
输出: 0->1->1->1->2->NULL

可以使用以下步骤来对给定的链表进行排序。

  • 遍历该列表,并计算0、1和2的数量。让n1、n2和n3分别为计数。
  • 再次遍历列表,用0填充前n1个节点,然后用1填充n2个节点,最后用2填充n3个节点。

下面的图形化解释以上过程:

C++程序 对0、1、2形式的链表进行排序

下面是以上方法的实现:

// C++程序,用于对包含0、1或2的链表进行排序
#include <bits/stdc++.h>
using namespace std;

// 链表节点
class Node
{
    public:
    int data;
    Node* next;
};

// 用于对包含0、1和2的链表进行排序的函数
void sortList(Node *head)
{
    // 将“0”、“1”和“2”的计数初始化为0
    int count[3] = {0, 0, 0};
    Node *ptr = head;

    /* 计算“0”、“1”和“2”的总数
       count[0]将存储“0”的总数
       count[1]将存储“1”的总数
       count[2]将存储“2”的总数 */
    while (ptr != NULL)
    {
        count[ptr->data] += 1;
        ptr = ptr->next;
    }

    int i = 0;
    ptr = head;

    /* 假设count[0] = n1,count[1] = n2
       和count[2] = n3,
       现在从头节点开始遍历列表,
       1)用0填充列表,直到n1> 0
       2)用1填充列表,直到n2> 0
       3)用2填充列表,直到n3> 0 */
    while (ptr != NULL)
    {
        if (count[i] == 0)
            ++i;
        else
        {
            ptr->data = i;
            --count[i];
            ptr = ptr->next;
        }
    }
}

// 用于推入节点的函数
void push (Node** head_ref,
           int new_data)
{
    // 分配节点
    Node* new_node = new Node();

    // 将数据放入
    new_node->data = new_data;

    // 链接新节点的旧列表
    new_node->next = (*head_ref);

    // 将头指针移动到指向新节点
    (*head_ref) = new_node;
}

// 用于打印链表的函数
void printList(Node *node)
{
    while (node != NULL)
    {
        cout << node->data << " ";
        node = node->next;
    }
    cout << endl;
}

// 驱动程序
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 << "在排序之前的链表:";
    printList(head);

    sortList(head);

    cout << "排序之后的链表:";
    printList(head);

    return 0;
}

输出:

在排序之前的链表:2 1 2 1 1 2 0 1 0
排序之后的链表:0 0 1 1 1 1 2 2 2

时间复杂度: O(n),其中n是链表中节点的数量。

辅助空间: O(1)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例