算法思想:如何拆分?观察得奇数数位都是a,偶数位数都是b
所以我们可以设置一个i=1初始化,然后依次累加,如果为奇数加到A表
否则加到B表,B不能像A一样使用尾插法了,应该使用头插法反序输出
#include<stdio.h>
#include <bits/stdc++.h>
typedef struct lnode{
int data;//数据
struct lnode *next;//指针域
}lnode,*LinkList;
int a[10]={1,2,3,4,5,6,7,8,9,10};
int n=10;
void InitList(LinkList &L){//尾插法初始化链表
L=(LinkList)malloc(sizeof(lnode));
lnode *s,*r=L;
for(int i=0;i<n;i++){
s=(lnode*)malloc(sizeof(lnode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void Print(LinkList L){
lnode *s=L->next;
while(s){
printf("%d",s->data);
s=s->next;
}
printf("\n");
}
LinkList B;
void DisCreateA_B(LinkList &A){
int i=0;
B=(LinkList)malloc(sizeof(lnode));
B->next=NULL;
lnode *a=A,*b=B;
lnode *p,*q;
p=A->next;//初始化a,b分别指向A,B的尾节点
//q=p->next;
A->next=NULL;
while(p){
i++;
if(i%2==0){
q=p->next; //使用一个q防止断链
p->next=b->next;
b->next=p;
p=q; //
}else{
a->next=p;
a=p;
p=p->next;
}
}
a->next=NULL;//这里很关键,因为b是头插法所以最后指向是为NULL
//但是这里a最后必须指向nuLL,不然就会默认连接b地址指向
// b->next=NULL;
}
int main(){
lnode *L;
InitList(L);
Print(L);
printf("_________________\n");
DisCreateA_B(L);
Print(L);
Print(B);
return 0;
}