单链表经典算法与时间复杂度分析

设计算法以删除链表中值为x的结点``
【算法描述】:
删除给定值的结点关键是寻找此结点和最终的释放内存。查找此结点需要一个循环,定义的指针p指向头结点因为不是双链表所以p每次的指向必须为直接前驱,循环控制条件是如果p的直接后继不是我们要找的值并且p不是最后一个结点,循环就可以继续,对应的跳出循环有两种情况,第一种是找到了,删除释放内存,没找到就返回false主函数里给用户提示信息。
【算法实现】:

bool DeleteElement(node *L, elementType x) //参数是单指针链表和要删除的元素X 
{
   
	node *p = L;   //定义一个指针p指向头结点(因为删除结点要指在被删除的直接前驱) 
	//注意循环体里的条件:p->next->data和x比较还是因为p必须指在被删除结点的前驱,另一个条件是p->next!=NULL即被删元素不能不存在 
	while(x!=p->next->data&&p->next!=NULL){
   
		p=p->next;
	}
	if(p->next==NULL){
   
		return false;
	}
	//执行删除操作 
	else{
   
		u = new node;
		u = p->next;
		p->next = u->next;
		delete u;   //释放结点防止内存泄露 
		return true;
	}
} 

假设递增有序的带头结点的单循环链表 A、B 分别表示两个集合,设计算法以求解 A= A∪B,并分析算法的时间复杂度
【算法描述】
原链表递增有序就需要利用这一个条件,集合的基本要求是不能存在两个相同的元素,每一个链表从受元素结点开始扫描,每扫描到一个元素就比较大小,从而分成三种情况,新链表采用尾插法,既可以调用尾插法的函数也可以直接写语句(语句比较简单),本算法采取了后者,由于是尾插,所以在所有的元素插入到新表之后要把新表的尾指针置空。
【算法实现】

int UniteList(node *A, node *B, node *&L)
{
   
	if(A->next==NULL||B->next==NULL){
     //排除A或B表中有空表的情况 
		return 1;
	}
	else{
   
		node *s;   //新插入的元素结点 
		node *p;
		p = A->next;
		node *q;
		q 
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值