王道书链表题目--有一个带头节点的单链表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; 
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_47505105/article/details/123538667