说明:
由于本人能力有限,文章难免有问题,希望各位大神不吝赐教,共同进步!
标题:链表的反转
问题描述:
问题描述
输入一个链表,反转链表后,输出链表的所有元素。
输入说明:
输入第一行为整数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
解题思路:
简单的链表题,可以有多种实现方式,下面仅写出一种实现,实现思路见代码。
C代码实现:
#include "stdio.h"
#include "malloc.h"
#include "string.h"
typedef struct linkList
{
int a;
struct linkList *next;
} list;
list *initialization (int R)
{
list *hand,*q,*e;
int a,i,j,k;
hand=(list*)malloc(sizeof(list));
q=hand;
for(i=0;i<R;i++)
{
scanf("%d",&a);
e=(list *)malloc(sizeof(list));
e->a=a;
q->next=e;
q=e;
}
q->next=NULL;
return hand;
}//链表的初始化
void reverseList(list * head){
if(head->next == NULL)
printf("error input!");
//判断输入是否正确
list *p = head->next;
list *p1 = p->next;
//指针遍历
while(p->next != NULL){
p->next = p1->next;
p1->next = head->next;
head->next = p1;
p1 = p->next;
}
}//链表反转的核心代码
void printf(list *hand) //遍历整个链结构,输出结果
{
list *q=hand->next;
while(q!=NULL)
{
printf("%d",q->a);
if(q->next!=NULL) printf(" ");
q=q->next;
}
}
int main()
{
int j,i,k;
scanf("%d",&j);
list *L[j];
for(i=0;i<j;i++)
{
scanf("%d",&k);
L[i]=initialization(k);
reverseList(L[i]);
}
for(i=0;i<j;i++)
{
printf(L[i]);
if(i!=j-1) printf("\n");
}
return 0;
}
总结:
这是简单的链表型题目,至少有两三种实现方式,希望同学们多多练习,链表可是机考最基础的题目!