假设有一个带头结点的单链表L={a1,b1,a2,b2,…,an,bn}。设计一个算法将其拆分成两个带头结点的单链表L1和L2:
L1={a1,a2,…,an},L2={bn,bn-1,…,b1}
要求L1使用L的头结点。
#include "stdio.h"
#include "stdlib.h"
typedef struct linknode
{
int data;
struct linknode *next;
}linklist;
int create_linklistT(linklist *L,int a[],int n)
{
int i;
linklist *r,*p;
r=L;
for(i=0;i<n;i++)
{
p=(linklist *)malloc(sizeof(linklist));
p->data=a[i];
r->next=p;
r=p;
}
r->next=NULL;
}
int show_linklist(linklist *L)
{
linklist *p;
p=L->next;
while(p!=NULL)
{
printf("%2d ",p->data);
p=p->next;
}
printf("\n");
}
int split_linklist(linklist *L,linklist *&L1,linklist *&L2)
{
linklist *p,*q,*r;
p=L->next;L1=L;L1->next=NULL;r=L1;
L2=(linklist *)malloc(sizeof(linklist));
L2->next=NULL;
while(p!=NULL)
{
//tail insert
r->next=p;
r=p;
p=p->next;
//head insert
q=p->next;
p->next=L2->next;
L2->next=p;
p=q;
}
r->next=NULL;
}
int main()
{ int a[10]={11,13,15,17,19,2,4,6,8,20};
int n=10;
linklist *L,*L1,*L2;
L=(linklist *)malloc(sizeof(linklist));
L->next=NULL;
create_linklistT(L,a,n);
show_linklist(L);
split_linklist(L,L1,L2);
show_linklist(L1);
show_linklist(L2);
}