6-1 单链表逆转 (20分)

//以下是调试代码:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */
List Reverse( List L );
int main()
{
List L1, L2;
L1 = Read();
L2 = Reverse(L1);
Print(L1);
Print(L2);
return 0;
}
List Read()
{
int n,i;
scanf("%d",&n);
struct Node *head=NULL,*s,*r=NULL;
head=(List *)malloc(sizeof(List));
if(head==NULL)
{
exit(1);
}
r=head;
s=(List *)malloc(sizeof(List));
if(s==NULL)
{
exit(1);
}
for(i=0;i<n;i++)
{
s=(List *)malloc(sizeof(List));
scanf("%d",&s->Data);
if(s==NULL)
{
exit(1);
}
r->Next=s;
r=r->Next;
}
r->Next=NULL;
return head->Next;//返回的是一个不带头结点的链表
}
void Print( List L )//输出不带头结点的链表
{
struct Node *p;
p=L;
while(p)
{
printf("%d ",p->Data);
p=p->Next;
}
printf("\n");
}
List Reverse( List L )
{
struct Node *Lcopy=NULL,*temp=NULL,*p,*q;
p=L;
while(p)
{
q=p->Next;
p->Next=Lcopy;
Lcopy=p;
p=q;
//temp=L->Next;
//L->Next=Lcopy;
//Lcopy=L;
//L=temp;
}
return Lcopy;
}

//这道题目输出样例中第一行中的那个1确实不太清楚,后来不带头结点就对了。我也是个渣渣。
/* 你的代码将被嵌在这里 */
//以下是AC代码
//重新定义一个链表,遍历链表时重新建立头插法一个单链表
List Reverse( List L )
{
struct Node *Lcopy=NULL,*temp=NULL,*p,*q;
p=L;
while(p)
{
q=p->Next;
p->Next=Lcopy;
Lcopy=p;
p=q;
//temp=L->Next;
//L->Next=Lcopy;
//Lcopy=L;
//L=temp;
}
return Lcopy;
}

浙公网安备 33010602011771号