数据结构-有一个带头结点的单链表L,设计一个算法使其元素递增有序

1.算法思想
解法可分为两种:
① 先将链表的数据复制到数组中,再采用时间复杂度为O(nlog2n)的算法进行排序,然后将数组元素依次插入到链表中,是以空间换时间的策略。

② 采用直接插入排序的思想,将链表分为两条链,一条由头结点及一个数据结点构成,另一条由剩下的结点构成。然后依次扫描第二条链中剩下的结点,并通过比较插入到第一条链中去。该算法的时间复杂度为O(n^2)

下面的代码采用的是第二种的解法。
2.源代码

void LinkSort(List list) {
	Node pre, p, r;
	p = list->Next; //r保持*p后继结点指针,以保证不断链
	r = p->Next;
	p->Next = NULL; //构造只有一个结点的链表
	p = r;
	while (p!=NULL) {
		r = p->Next; //保存p结点后的结点指针
		pre = list; //每次都从表头开始比较
		while (pre->Next != NULL && p->Data > pre->Data)
			pre = pre->Next;

		/*下面两步为插入操作*/
		p->Next = pre->Next;
		pre->Next = p;

		//P向后扫描
		p = r;
	}
}

你可能感兴趣的:(数据结构)