题目:
给定一个带头结点的无序单链表L,使其元素递增有序
思路:
采用直接插入算法的思想,先构造只有一个数据结点的有序单链表,然后依次扫描单链表剩下的结点。
代码实现:
#include <bits/stdc++.h>
#define OK 1
#define OVERFLOW -1
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status ListCreate_L(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
LinkList p = L;
p->next = NULL;
int x;
while (scanf("%d", &x) == 1 && x != -1) {
LinkList tp = (LinkList)malloc(sizeof(LNode));
tp->data = x;
p->next = tp;
tp->next = NULL;
p = tp;
}
return OK;
}
void ListSort_L(LinkList &L)
{
LinkList p, q, tp;
p = L->next;
q = p->next; // q保存p的后继结点指针,保证不断链
p->next = NULL; // 断开单链表, 前半部分有序, 后半部分无序
p = q; // p指向无序部分的第一个值
while (p != NULL) {
q = p->next; // 保存p的后继防止丢失
tp = L; // 用tp从头遍历 有序部分 找到插入位置
while (tp->next!=NULL && (tp->next->data) < (tp->data)) {
tp = tp->next;
}
p->next = tp->next;
tp->next = p;
p = q; // 将无序部分再给p
}
}
void ListPrint_L(LinkList L)
{
LinkList p = L->next;
while (p != NULL) {
if (p->next != NULL)
cout << p->data << " ";
else
cout << p->data;
p = p->next;
}
}
int main()
{
LinkList L;
ListCreate_L(L);
ListSort_L(L);
ListPrint_L(L);
return 0;
}
改进方法:
为缩短时间复杂度,可以先将链表数据复制到数组中,再用时间复杂度为的排序算法排序。不过,这就变成了以空间换取时间。