每日算法篇(11)

每日算法篇-22王道数据结构

“11月如约而至,感觉自己很充实的过了一个月,10月可能我21年过去的时光中最努力的一个月,下定决心为了自己拼了老命。当然我也相信11月和12月的我会更上一个台阶。1024那天好像抢到一个CSDN的电子书vip,一年的哈哈哈,给自己定个小目标,11月看完5本书,当然自己日常计划不能停。努力画未来。”——努力成为程序员的耿耿(2021/11/1)

题目

试编写在带头结点的单链表L中删除一个最小值的高效算法(假设最小值结点是唯一的)。
思考: 首先看到的结点唯一就很清楚,定义删除一个指定结点的算法,现在就是找到最小值的问题,在单链表中删除一个结点需要两个指针,但是还要有两个固定的最小值比较的指针,所以题目就显而易见了,定义4个指针,循环遍历中一个前驱一个该节点还有两个指向遍历到该节点前的最小值即可,下面看代码。

Linklist del_min(Linklist &L){
     
	Linknode *pre=L,*p=L->next;  //注意L是指头结点
	Linknode *minpre=per,*minp=p;  //最小值的两个结点是初始化为第一个结点
	while(p!=NULL){
     
		if(p->data<minp->data){
      //查出最小值
			minpre=pre;
			minp=p;
		}
		pre=p;
		p=p->next;
	}
	minpre->next=minp->next; //删除最小值
	free(minp);  //释放空间,注意链表的删除一定要释放空间
	retrun L;
}

我一开始写的时候没想到可以设置这么多指针,我就用3个然后就遍历整个表,把最小的挪到头指针之后,最后再删除头指针后的那个结点,其实是可以做的,但是重复性动作太多,复杂度很高。大家看题目后要先自己写一遍,再看答案,这样会有醒悟性的发现。

你可能感兴趣的:(数据结构,算法,数据结构,链表)