链表的相关算法及应用(三)

问题六 :将两个单链表的相同的值,组成一个新的链表 

问题七 :递增输出单链表 并释放节点 

问题八 :将一个带头结点的单链表A 分解为两个带头结点的单链表A和B使A中保存原来序号为奇数的元素,B中保存原来序号为偶数的元素

问题九 :将C={a1,b1,a2,b2,...,an,bn},拆分为 A={a1,a2,...,an} B={b1,b2,...,bn}; 

问题十 :去除递增有序链表中的重复元素 

//问题六 将两个单链表的相同的值,组成一个新的链表 
LinkList common(LinkList L1,LinkList L2){
LNode *t1=L1->next,*t2=L2->next;
bool yes = 0;
LNode *h = (LNode*)malloc(sizeof(LNode));
h->next=NULL;
while(t1){
yes=0;
t2=L2->next;
while(t2){
if(t1->data==t2->data){
yes=1;
break;
}
t2=t2->next;
}
if(yes){
LNode *node = (LNode*)malloc(sizeof(LNode));
node->data=t1->data;
node->next=h->next;
h->next = node;
}
t1=t1->next;
}
return h;
}
//问题七 递增输出单链表 并释放节点
void min_del(LinkList &L){
LNode *pre=L,*p=L->next,*t;
while(L->next!=NULL){
pre=L;
p=L->next;
while(p->next!=NULL){
if(p->next->data<pre->next->data){
pre=p;
}
p=p->next;
}
t=pre->next;
printf("%d ",t->data);
pre->next=t->next;
free(t);
}
free(L);
}
//问题八 将一个带头结点的单链表A 分解为两个带头结点的单链表A和B
//    使A中保存原来序号为奇数的元素,B中保存原来序号为偶数的元素
LinkList disCreate(LinkList &A){
LinkList B = (LinkList)malloc(sizeof(LNode));
B->next=NULL;
LNode *a=A,*b=B;
LNode *r,*p=A->next;
int index = 1;
while(p!=NULL){
if(index%2){
a->next=p;
a=p;
}else{
b->next=p;
b=p;
}
index++;
p=p->next;
}
a->next=NULL;
b->next=NULL;

return B;
}
//问题九 将C={a1,b1,a2,b2,...,an,bn},拆分为 A={a1,a2,...,an} B={b1,b2,...,bn}; 
LinkList disCreate2(LinkList &A){
LinkList B = (LinkList)malloc(sizeof(LNode));
B->next=NULL;
LNode *r,*a=A;
int index = 1;
LNode *p = A->next;
while(p!=NULL){
r=p->next;
if(index%2){
a->next=p;
a=p;
}else{
p->next=B->next;
B->next=p;

}
p=r;
index++;
}
a->next=NULL;
return B;    
}
//问题十 去除递增有序链表中的重复元素 
void moveRepeat(LinkList &L){
LNode *pre=L,*p=L->next;
while(p!=NULL){
if(p->next!=NULL){
if(p->data!=p->next->data){
pre->next=p;
pre=p;
}
}else{
pre->next=p;
pre=p;
}
p=p->next;
}
pre->next=NULL;
}
原文地址:https://www.cnblogs.com/hekuiFlye/p/9360112.html