单链表习题整理(四)

题目一

已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素),同时释放被删结点空间,并分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)

思想

首先排除两个错误的情况:1、L为空或不存在,2、mink>maxk
其次问题是删除结点,循环整个表,满足条件的free掉,不满足则指向下一个结点

代码

Status T219(LinkList L,int mink,int maxk)
{
	LinkList p,pre,s;
	if(!L||!L->next)		//L不存在或者为空表时返回错误
		return ERROR;
	if(mink>=maxk)			//当阙值设置错误时,返回错误
		return ERROR;
	pre=L;
	p=pre->next;
	while(p&&p->data<maxk)
	{
		if(p->data<=mink)
		{
			pre=p;
			p=p->next;
		}
		else
		{
			s=p;
			pre->next=p->next;
			p=p->next;
			free(s);
		}
	}
	return OK;
}

题目二

已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂度

思想

这个题目跟上面题目类似,判断条件换为当pre->data=p->data即可

代码

Status T220(LinkList L)
{
	LinkList p,pre,s;
	if(!L||!L->next)
		return ERROR;
	pre=L->next;
	p=pre->next;
	while(p)
	{
		if(pre->data=p->data)				//满足条件,则删除这个结点
		{
			s=p;
			pre->next=p->next;
			p=p->next;
			free(s);
		}
		else
		{
			pre=p;
			p=p->next;
		}
	}
	return OK;
}
发布了73 篇原创文章 · 获赞 20 · 访问量 4480

猜你喜欢

转载自blog.csdn.net/lzl980111/article/details/102940996