单链表的逆置,去重以及用单链表求两个集合的差集

单链表的逆置

/*依次取原链表中的每个结点,将其作为第一个结点插入到新的链表中*/

有点类似于尾插法


void Reserve(LinkList H){
	LNode *p,*q;
	p=H->next;                   //p指向首元结点 
	H->next=NULL;                //将原链表置空 
	while(p){
		q=p;                    //q指向当前结点 
		p=p->next;              //p向后移动 
		q->next=H->next;        //相当于单链表的插入 
		H->next=q;
	}
} 

顺便看一下数组的逆置(或者说是字符串逆置)

#include<stdio.h>
#include<string.h>
int main()
{
	char a[100];
	gets(a);
	int i;
	char t;
	for(i=0;i<strlen(a)/2;i++)
	{
		t=a[i];
		a[i]=a[strlen(a)-i-1];
		a[strlen(a)-i-1]=t;
	}
	for(i=0;i<strlen(a);i++)
	printf("%c",a[i]);
}

单链表的去重


/*用指针指向首元结点,从后继开始找重复结点*/

详细解释请看代码


void pur_LinkList(LinkList H){
	LNode *p,*q,*r;
	p=H->next;                              //p指向首元结点 
	if(p!=NULL){                            //判断链表是否非空 
		while(p->next){                     //开始遍历该链表的所有结点 
			q=p;                            //q指向当前结点 
			while(q->next){                 //开始遍历当前结点后面的所有结点 
				if(q->next->data==p->data){ //如果找到重复元素,进行删除操作 
					r=q->next;              //用r保存重复结点 
					q->next=r->next;        //删除r 
					free(r);
				}
				else{                       //如果不是重复结点继续向后移动 
					q=q->next;
				}
			}                  
			p=p->next;                
		}
	}
} 

 时间复杂度为O(n^2);

用单链表计算两个集合的差集

/*假设集合A用单链表LA来表示,集合B用单链表LB来表示,差集就是集合A中属于A但是不属于B的元素的集合
因此,对于集合A中的每个元素e在集合B中的链表LB中查找,若存在与e相同的元素,则在LA中将其删除*/

详细解释见以下代码


void Difference(LinkList LA,LinkList LB){
	Node *pre,*p,*r;
	pre=LA;
	p=pre->next;                        //p指向表中某一节点,pre始终指向p的前驱
	while(p!=NULL){                     //开始遍历LA
	     q=Lb->next;
		 while(q!=NULL&&q->data!=p->data){//在LB中找与LA中该元素一样的结点 
		 	q=q->next;
		 }
		 if(q!=NULL){                   //如果找到了,删除LA中的结点p 
		 	r=p;
		 	pre->next=p->next; 
		 	p=p->next;                  //p向后移动一位 
		 	free(r);
		 }
		 else{                          //如果没找到向后移动指针 
		 	pre=p;
		 	p=p->next;
		 }
	}
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值