您的位置:首页 > 理论基础 > 数据结构算法

数据结构基础PTA 6-1 单链表逆转

2018-02-20 02:17 363 查看

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

本题要求实现一个函数,将给定的单链表逆转。

函数接口定义:

List Reverse( List L );
其中
List
结构定义如下:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
L
是给定单链表,函数
Reverse
要返回被逆转后的链表。

裁判测试程序样例:

#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;
}

/* 你的代码将被嵌在这里 */

输入样例:

5
1 3 4 5 2

输出样例:

1
2 5 4 3 1
唔,我觉得我的函数肯定是不够好的,我把read函数也自己实现了一遍,为了调试用;一开始看题目觉得有点奇怪啊,为什么print(L1)就只剩下1了,因为后面的节点都移到前面去了,然而又没有修改L1,所以L1只剩下一个元素了;然后reverse这个函数,肯定有多种写法的,自己写的很不优雅!甚至说代码写的很难看,用while或许会更好点,最重要的就是两步:
step1: delete:  p->next = q->next;
step2: insert:  q->next = L;    L=q;#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List; //like the head

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */

List Reverse( List L );
List Read(){
int num,i;
scanf("%d",&num);
List L1;
L1 = NULL;

while (num) {
scanf("%d",&i);
PtrToNode p = (Node *)malloc(sizeof(Node));
p->Data = i;
p->Next = NULL;
if(L1 == NULL){
L1 = p;
}else{
PtrToNode tmp = L1;
for(; tmp->Next; tmp=tmp->Next); // point!!!
tmp->Next = p;
}
num--;
}
return L1;
}

void Print(List L){
PtrToNode p = (Node *)malloc(sizeof(Node));
for(p=L; p ;p=p->Next)
printf("%d ",p->Data);
}
List Reverse( List L ){
PtrToNode p,q;
for(p=L; p; ){
q = p->Next;
if(q){
p->Next = q->Next;
q->Next = L;
L = q;
}else
break;
}
return L;
}
// I should check how others do this, in a more elegant coding way;

int main()
{
List L1, L2;
L1 = Read();
L2 = Reverse(L1);
Print(L1); //After reverse, there is only one node left in L1, really special!!!
Print(L2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PTA