单链表的逆置
/*依次取原链表中的每个结点,将其作为第一个结点插入到新的链表中*/
有点类似于尾插法
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;
}
}
}