题目:
设c={a1,b1,a2,b2,.......,an,bn}为线性表,采用头结点的单链表存放,设计一个就地算法,将其拆分为两个线性表,使得A={a1,a2,.......,an},B={bn,........b2,b1}.
思路:
从前往后遍历,A正序尾插法(直接在c中挪走B的元素得到A),B逆序头插法(把B的元素头插到另一个链表中)。设置三个指针*r用于指向p的前一个元素,*p指向当前元素,*q防止断链。
#include<bits/stdc++.h>
using namespace std;
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 buildlist(linklist &l,int a[],int n){
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=r->next;
}
r->next=NULL;
}
void print(linklist l){
lnode *p=l->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void cutlist(linklist &l1,linklist &l2){
l2=(linklist)malloc(sizeof(lnode));
l2->next=NULL;
lnode *p=l1->next,*q,*r=l1;
while(p){
r->next=p;
r=r->next;
p=p->next;
if(p!=NULL){ //处理bn
q=p->next;
}
p->next=l2->next; //头插 同时删掉了bn
l2->next=p;
p=q;
}
r->next=NULL;
}
int main(){
linklist l1,l2;
buildlist(l1,a,n);
print(l1);
cutlist(l1,l2);
print(l1);
print(l2);
return 0;
}