问题描述
输入一个链表,反转链表后,输出链表的所有元素。
输入说明
输入第一行为整数n(n>=1),代表测试链表数。
从第二行开始每行表示一个链表,其中第一个数据表示链表中数据个数,其余数据表示要测试的链表中的数据,均为整数。
输出说明
每一行对应一个链表反转后的元素。
输入样例
3
5 1 2 3 4 5
3 2 4 5
1 3
输出样例
5 4 3 2 1
5 4 2
3
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct list
{
int a;
struct list *next;
}l;
l *cre(int n)
{
int a,i;
l *head,*r,*s;
head=(l*)malloc(sizeof(l));
r=head;
for(i=0;i<n;i++)
{
scanf("%d",&a);
s=(l *)malloc(sizeof(l));
s->a=a;
r->next=s;
r=s;
}
r->next=NULL;
return head;
}
void f(l *head,int n)//头尾交换
{
l *h=head->next,*r=head->next,*q=head->next,*p,*end;
int i;
if(n==2)
{
r=r->next;
r->next=h;
h->next=NULL;
head->next=r;
}
else if(n>2)
{
while(r->next!=NULL) r=r->next;
end=r;
while(q->next!=r) q=q->next;
r->next=q;
p=h->next;
h->next=NULL;
for(i=0;i<n/2-1;i++)
{
r=p;
while(r->next!=q) r=r->next;
q->next=r;
q=p;
if(r==q) break;
while(q->next!=r) q=q->next;
r->next=q;
}
q->next=h;
head->next=end;
}
}
/*
void reverse(l *head)//依次反转
{
l *t=NULL,*p=head->next,*q;
while(p)
{
q=p->next;
p->next=t;
t=p;
p=q;
}
head->next=t;
}
*/
void output(l *head)
{
l *r=head->next;
while(r!=NULL)
{
printf("%d",r->a);
if(r->next!=NULL) printf(" ");
r=r->next;
}
}
int main()
{
int n,i,k;
scanf("%d",&n);
l *L[n];
for(i=0;i<n;i++)
{
scanf("%d",&k);
L[i]=cre(k);
f(L[i],k);
}
for(i=0;i<n;i++)
{
output(L[i]);
if(i!=n-1) printf("\n");
}
return 0;
}