📜  单链表中插入排序的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:37:03.548000             🧑  作者: Mango

单链表中插入排序的 C++ 程序

单链表是一种常见的数据结构,它可以用来存储一系列元素并支持常见的操作,例如插入、删除和查找等。在实际的编程中,我们通常需要对链表进行排序以便更好地处理数据。

插入排序是一种简单而高效的排序算法,它的基本思想是每次从未排序的元素中取出一个元素,将它插入到已排序的序列中的正确位置。具体实现时,我们可以维护一个已排序的子链表,并从头到尾扫描未排序的链表,将每个元素插入到已排序的链表中。

下面是单链表中插入排序的 C++ 程序:

// 定义链表节点结构体
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        if (!head) return head;

        ListNode *dummy = new ListNode(0);
        dummy->next = head;

        ListNode *cur = head;
        while (cur->next) {
            if (cur->next->val < cur->val) {
                ListNode *pre = dummy;
                while (pre->next->val < cur->next->val) {
                    pre = pre->next;
                }
                ListNode *temp = cur->next;
                cur->next = temp->next;
                temp->next = pre->next;
                pre->next = temp;
            } else {
                cur = cur->next;
            }
        }

        ListNode *res = dummy->next;
        delete dummy;
        return res;
    }
};

该程序的输入是一个链表的头节点,输出是排序后的链表的头节点。

程序中使用了一个虚拟头节点(dummy)来简化代码编写。同时,程序中还定义了一个辅助函数ListNode的结构体,用于表示链表节点。

该程序的核心部分是while循环中的if-else语句块。当链表中存在逆序对(cur和cur->next)时,我们需要将cur->next节点插入到已排序的链表中。具体实现时,我们需要在已排序的链表中找到cur->next节点的正确位置(pre),并将它插入到该位置之前。最后,更新cur的指针,继续扫描链表,直到链表中不存在逆序对为止。

该程序的时间复杂度是O(n^2),其中n是链表的长度。另外,该程序是一种稳定的排序算法,它不会改变相等元素之间的相对顺序。