【问题描述】
设带头结点的单链表表示的线性表L=(a1,a2,a3,a4,……,an),试用复杂度为O(n)的算法,原地将L改造为L=(a1,a3, ……,a2,a4, ……)。
【输入形式】
第一行输入单链表元素个数n;
第二行输入n个整数。
【输出形式】
输出改造后的单链表。
【样例输入】
9
1 2 3 4 5 6 7 8 9
【样例输出】
1 3 5 7 9 2 4 6 8
【测试代码】
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *next;
} node,*LinkList;
void CreateList(LinkList *wx,int n)
{
LinkList p,q;
int i;
int e;
(*wx)=p=(LinkList)malloc(sizeof(node));
for(i=1; i<=n; i++)
{
q=(LinkList)malloc(sizeof(node));
scanf("%d",&e);
q->data=e;
p->next=q;
p=q;
}
p->next=NULL;
}
void PrintList(LinkList wx)
{
LinkList p=wx->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void form(LinkList wx)
{
LinkList p,q,r;
p=wx->next;
q=p->next;r=q->next;
while(q->next && r)
{
q->next=r->next;
r->next=p->next;
p->next=r;
p=r;
q=q->next;
if(q==NULL)break;
r=q->next;
}
}
int main()
{
LinkList wx;
int n;
scanf("%d",&n);
CreateList(&wx,n);
form(wx);
PrintList(wx);
return 0;
}