数据结构基础之单链表的应用(二)

设计算法将两个递增有序的带头结点的单链表 A、B 合并为一个递增有序的带头结 点的单链表,并要求算法的时间复杂度为两个表长之和的数量级

//没有对元素结点的删除操作,而是通过R指针将A和B的结点连接起来
void Merge_LinkList1(node* La,node *Lb){
	node *pa, *pb, R;
	
	pa = La->next;
	pb = Lb->next;
	R = La;
	
	while (pa!=NULL && pb!=NULL){
		if (pa->data <= pb->data){
			R->next = pa;
			R = pa;
			pa = pa->next;
		}
		else if (pa->data > pb->data){
			R->next = pb;
			R = pb;
			pb = pb->next;
		}
		
	}
	
	if (pa != NULL)
		R->next = pa;
	if (pb != NULL)
		R->next = pb;
	delete Lb;
} 

设计算法将链表 L 就地逆置,即利用原表各结点的空间实现逆置

//方法一 用单链表的知识来解决
void listReverse_L(node*& L){
	node *p, *q;
	
	p = L->next;
	L->next = NULL;
	
	while (p){
		q = p->next;
		p->next = L->next;
		L->next = p;
		p = q;
	} 
}

//方法二 利用栈技术解决
//下列算法是处理不带头结点的单链表,如果处理带头结点的单链表,可以在主函数中处理,先产生不带头结点的指针,在调用此函数
typedef node* elementType;

void reverse(node*& L){
	
	seqStack S;
	initialStack(S);
	
	u = L;
	while (u){
		pushStack(u);
		u = u->next;
	}
	
	if (stackEmpty(S))
		return;
	
	stackTop(S,u;) 
	L = u;//设置表头指针
	R = u;//表尾指针
	
	popStack(S, u);
	while (!stackEmpty(S)){
		stackTop(S, u);
		R->next = u;
		u->next = NULL;
		R = u;
		
		popStack(S, u);
		 
	}
	
	 
} 

设计算法将两个递增有序的带头结点的单链表 A、B 合并为一个递减有序的带头结 点的单链表,并要求算法的时间复杂度为两个表长之和的数量级

node* listJoinAndReverse_L(node* A, node* B){
	node *pa, *pb, *p, *L;
	
	pa = A->next;
	pb = B->next;
	L = A;
	L->next = NULL;
	
	while (pa != NULL && pb != NULL){
		if (pa->data < pb->data){
			p = pa->next;
			pa->next = L->next;
			L->next = pa;
			pa = p;
		}
		else{
			p = pb->next;
			pb->next = L->next;
			L->next = pb;
			pb = p;
		}
	}
	
	while (pa != NULL){
		p = pa->next;
		pa->next = L->next;
		L->next = pa;
		pa = p;
	}
	while (pb != NULL){
		p = pb->next;
		pb->next = L->next;
		L->next = pb;
		pb = p;
	}
	
	return L;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值