题目
本题要求实现一个函数,将给定的单链表逆转。函数接口定义: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;}/* 你的代码将被嵌在这里 */输入样例:51 3 4 5 2输出样例:12 5 4 3 1
思路:


此时将L重新指向原来的链表的第一个位置,但原来的链表少了一个A,此时就指向了B,让temp指向下C。用代码实现就是:
Prev = L;
L = Temp;Temp = L->Next;
在这里就实现两个新的链表。
代码:
#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(){List head = NULL;List current;List prev = NULL;int len = 0;scanf("%d", &len);if (len == 0)return NULL;while (len--){current = (List)malloc(sizeof(struct Node));if (head == NULL)head = current;elseprev->Next = current;current->Next = NULL;scanf("%d", ¤t->Data);prev = current;}return head;}void Print(List L){List p = L;List s = L;List temp;if (p == NULL)printf("NULL");elseprintf("\n");while (p != NULL){printf("%d ", p->Data);p = p->Next;}}/* 你的代码将被嵌在这里 */List Reverse(List L){if (L==NULL || L->Next == NULL){return L;}List temp;List newList = NULL;while (L != NULL){temp = L->Next;L->Next = newList;newList = L;L = temp;}return newList;}
