PAT练习题
经典的方法,用三个指针移动,p1,p2,tmp(临时指针)
核心代码:
tmp = p2->Next;//记录下一个节点
p2->Next = p1;//逆序,指向前一个节点
p1 = p2;//移动到下一个节点
p2 = tmp;//移动到下一个节点
#include <iostream>
using namespace std;
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);
/*for(int i=0;i<5;i++){
cout<<L1->Data<< " ";
L1 = L1->Next;
}
cout<<endl;
for(int i=0;i<5;i++){
cout<<L2->Data<< " ";
L2 = L2->Next;
}*/
Print(L1);
Print(L2);
system("pause");
return 0;
}
/* 你的代码将被嵌在这里 */
List Read()
{
int n=0;
cin>>n;
List p = new Node;
List tmp =p;
for(int i=0;i<n;i++){
List t = new Node;
cin>>t->Data;
tmp->Next = t;
t->Next = NULL;
tmp = tmp->Next;
}
return p;
}
void Print( List L )
{
List p1 = L->Next;
do{
cout<<p1->Data<<" ";
}while(p1 = p1->Next);
cout<<endl;
delete p1;
}
List Reverse( List L )
{
List p1,p2,tmp;
p1 = L->Next;
p2 = p1->Next;
while(p2){
tmp = p2->Next;
p2->Next = p1;
p1 = p2;
p2 = tmp;
}
L->Next->Next = NULL;
L->Next = p1;
return L;
}