📅  最后修改于: 2023-12-03 15:37:03.548000             🧑  作者: Mango
单链表是一种常见的数据结构,它可以用来存储一系列元素并支持常见的操作,例如插入、删除和查找等。在实际的编程中,我们通常需要对链表进行排序以便更好地处理数据。
插入排序是一种简单而高效的排序算法,它的基本思想是每次从未排序的元素中取出一个元素,将它插入到已排序的序列中的正确位置。具体实现时,我们可以维护一个已排序的子链表,并从头到尾扫描未排序的链表,将每个元素插入到已排序的链表中。
下面是单链表中插入排序的 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是链表的长度。另外,该程序是一种稳定的排序算法,它不会改变相等元素之间的相对顺序。