飞道的博客

第二章:链表

497人阅读  评论(0)

1.将两个递增的有序链表合并成一个递增的有序链表?[去重 + 不开辟新空间]

void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){
   
	pa=La->next; pb=Lb->next;        //初始化第一个节点
	Lc=pc=La;                        //La节点作为Lc头结点
	while(pa && pb){
                    //没到表尾部 
		if(pa->data<pb->data){
          //将pa插入pc后面,pa后移 
			pc->next=pa;
			pc=pa;
			pa=pa->next;
		}else if(pa->data>pb->data){
    //将pb插入pc后面,pb后移 
			pc->next=pb;
			pc=pb;
			pb=pb->next; 
		}else{
   						 //相等pa插入pc后,删除pb 
			pc->next=pa;
			pc=pa;
			pa=pa->next;
			q=pb->next;
			delete pb;
			pb=q; 
		}
	} 
	pc->next=pa?pa:pb;               //插入剩余段 
	delete Lb;	 
}

2.将两个递增的有序链表合并成一个递减的有序链表?[不开辟新空间]

void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){
   
	pa=La->next; pb=Lb->next;          //初始化第一个节点
	Lc=pc=La; Lc->next=NULL;
	while(pa || pb){
   
		if(!pa) {
                         //La空,q指向pb,pb后移 
			q=pb;
			pb=pb->next;
		}else if(!pb){
                    //Lb空,q指向pa,pa后移 
			q=pa;
			qa=qa->next;
		}else if(pa->data<pb->data){
   
			q=pa;
			pa=pa->next;
		}else{
   
			q=pb;
			pb=pb->next;
		} 
		q->next=Lc->next;              //q指向Lc下一个节点,反之 
		Lc->next=q;
	}
	delete Lb;	 
} 

3.两个递增链表A、B,求A∩B的结果存放在A中?

void Mix(LinkList &La,LinkList &Lb,LinkList &Lc){
   
	pa=La->next; pb=Lb->next;            //初始化第一个节点
	Lc=pc=La;
	while(pa && pb){
   
		if(pa->data==pb->data){
             //交集加入Lc 
			pc->next=pa;
			pc=pa;
			pa=pa->next;
			q=pb; pb=pb->next; delete q;	
		}else if(pa->data<pb->data){
   
			q=pa; pa=pa->next; delete q;
		}else{
   
			q=pb; pb=pb->next; delete q;
		}
	} 
	while(pa){
    q=pa; pa=pa->next; delete q; }           //释放pa节点
	while(pb){
    q=pb; pb=pb->next; delete q; }           //释放pb节点
	pc->next=NULL;          //链表尾部结束
	delete Lb; 
} 

4.两个递增链表A、B,求A-B的结果、并返回元素个数?

void Different(LinkList &La,LinkList &Lb,int &n){
   
	pa=La->next; pb=Lb->next;
	pre=La;         //pre为pa前驱
	while(pa && pb){
   
		if(pa->data<pb->data){
       //pa后移 
			pre=pa;
			pa=pa->next;
			*n++;
		}else if(pa->data>pb->data) pb=pb->next;    //q后移 
		else{
           //相等就要删除pa 
			pre->next=pa->next;     //前驱后移到当前的下一个 
			q=pa; pa=pa->next; delete q;   //删除当前节点 
		}
	} 
} 

5.将带头结点的A链表,分成B、C两个链表?[B中元素小于0 + C中元素大于0]

void Dis(LinkList A){
   
	B=A; B->next=NULL;       //B初始化 
	C=new LinkList(); C->next=NULL;
	p=A->next;
	while(p!=NULL){
   
		r=p->next;  //暂存p的后继
		if(p->data<0){
          //存入b 前插 
			p->next=B->next;
			B->next=p;
		}else{
   
			p->next=C->next; //存入c 前插 
			C->next=p;
		}
		p=r;   //指向待处理节点 
	}
} 

6.遍历链表求值最大的节点?

int Maxm(LinkList L){
   
	if(L->next==NULL) return NULL;
	maxn=L->next;       //假设第一个节点为最大值 
	p=L->next->next;    //从第二个节点开始遍历 
	while(p!=NULL){
   
		if(p->data>maxn->data) maxn=p;   //大于当前最大值,重新复制 
		p=p->next;
	}
	return maxn->data;
} 

7.遍历链表,反转链表?

void Reverse(LinkList &L){
   
	p=L->next;  L->next=NULL; //逆置带头节点的L 
	while(p){
   
		q=p->next;
		p->next=L->next;
		L->next=p;
		p=q;
	}
} 

8.删除递增链表L中,大于mink且小maxk的元素?

void Delete(LinkList &L,int mink,int maxk){
   
	p=L->next;
	while(p && p->data<=mink){
   
		pre=p; p=p->next;    //pre为第一个大于mink的指针 
	}
	if(p){
   
		while(p && p<maxk) p=p->next;    //p为第一个大于maxk的指针
		q=pre->next;  pre->next=p;   //看不懂
		while(q!=p){
   
			xnx=q->next; delete q; q=xnx;    //删除之间的节点 
		} 
	}
} 

转载:https://blog.csdn.net/xg987599519/article/details/112000274
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场