【题目描述】 用链表实现插入排序,从小到大排序。 【输入格式】 第一行一个数n表示数的个数 第二行n个数表示待排序的序列 【输出格式】 一行n个数表示排序的结果。 【样例输入】 3 3 2 1 【样例输出】 1 2 3 c++
时间: 2024-01-17 15:06:02 浏览: 71
好的,以下是使用C++实现链表插入排序的代码:
```c++
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* insertionSortList(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *curr = head->next;
head->next = NULL;
while (curr) {
ListNode *prev = dummy;
ListNode *next_node = prev->next;
while (next_node) {
if (curr->val < next_node->val) {
break;
}
prev = next_node;
next_node = next_node->next;
}
ListNode *temp = curr->next;
curr->next = next_node;
prev->next = curr;
curr = temp;
}
return dummy->next;
}
int main() {
int n;
cin >> n;
ListNode *head = NULL;
ListNode *tail = NULL;
for (int i = 0; i < n; i++) {
int num;
cin >> num;
ListNode *node = new ListNode(num);
if (!head) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
ListNode *sorted_head = insertionSortList(head);
while (sorted_head) {
cout << sorted_head->val << " ";
sorted_head = sorted_head->next;
}
cout << endl;
return 0;
}
```
我们同样定义了一个链表节点结构体ListNode,其中val表示节点的值,next表示指向下一个节点的指针。insertionSortList函数接受一个链表头节点head,返回排好序的链表头节点。
我们首先定义了一个dummy节点,它是一个哨兵节点,用于简化代码实现。然后遍历链表,对于每个节点curr,我们需要找到它在排好序的链表中应该插入的位置。我们从dummy节点开始遍历排好序的链表,找到第一个大于curr节点的节点next_node,然后将curr节点插入到它的前面。
在main函数中,我们首先读取输入的链表节点,将它们按顺序连接成一个链表。然后调用insertionSortList函数对链表进行插入排序,并输出排好序的链表节点的值。
希望这个C++实现能够解答你的问题。
阅读全文