本文提供一个简单好理解的解法,利用堆栈的思想来逆序
原文题目
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
裁判程序
#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;
}
/* 你的代码将被嵌在这里 */
解法1-前插方法
这个方法网上基本都采用
List Reverse( List L )
{
List seek;
List temp;
seek=L;
L=NULL;
while(seek)
{
temp=seek;//工作节点前来追赶
seek=seek->Next;//此节点往前探
temp->Next=L;//工作节点往回逆序
L=temp;//头节点更新上来
}
return L;
}
解法2-模拟堆栈法
List Reverse(List L)
{
/*初始化一个简单的堆栈*/
List s[1000];
for(int j=0;j<1000;j++)
s[j]=NULL;
/*将链表从后往前存在数组中*/
int i=999;
while(L)
{
s[i]=L;
L=L->Next;
i--;
}
/*数组中的节点的Next全部初始化为NULL*/
for(int k=i+1;k<1000;k++)
{
s[k]->Next=NULL;
}
/*顺序的链接起来直接实现逆序操作*/
for(int k=i+1;k<999;k++)
{
s[k]->Next=s[k+1];
}
/*返回头节点即可*/
return s[i+1];
}