王道书链表题目--有一个带头节点的单链表L,使其元素递增有序

答案的方法是使用头插法,我第一遍看的时候有点绕。补充的答案是将链表复制到一个数组中,再用时间复杂度为O(nlogn)的排序算法进行排序,这个很容易理解。

在此,我想记录一下自己写这个题目的方法。

思路

在这里插入图片描述

  1. 我的思路是先联想数组的排序算法中哪种可以适用到链表
  2. 最先想到的是冒泡排序和快速排序(对我而言),但是二者用在链表上都不好实现
  3. 我又想到了另一种—选择排序,先用指针指向第一个节点,然后去找所有节点中最小的,找到后将data,与指针指向的节点的data交换。于是,最小的data就放在了第一个节点中。
  4. 指针后移,再找从第二个节点开始最小的元素,再与之交换,以此类推。
  5. 即:每次都把最小的节点的data和指针指向的元素的data进行交换

书写

void sort_link(LinkList &L){
	ElemType min,temp;
	LinkList p,q;
	mindex = NULL;// mindex初始化为空 
	p = L->next;
	while(p->next != NULL) {
		// 最多被比较到倒数第二个节点就够了
		min = p->data;// 初始的最小值,每次也都是p->data 
		q = p->next;
		while( q!= NULL) {// 一直到最后一项要和min去比较 
			 if(q->data <min){
			 	min = q->data;
			 	mindex = q;
			 }
			 q = q->next;
		}// 最里层的while循环结束,意味着找到了最小的data
		
		if(mindex != NULL){
		//如果mindex不为空,则表示之后的节点有比p->data更小的,因此进行交换
		temp = p->data;
		p-data = min;
		mindex->data = temp;// 记住这里是mindex,而不是q
		//因为跳出循环,q就等于NULL了 
		}
		
		// p指针再后移,进行下一轮内循环
		p = p->next; 
	}
}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值