题目

  1. 本题要求实现一个函数,将给定的单链表逆转。
  2. 函数接口定义:
  3. List Reverse( List L );
  4. 其中List结构定义如下:
  5. typedef struct Node *PtrToNode;
  6. struct Node {
  7. ElementType Data; /* 存储结点数据 */
  8. PtrToNode Next; /* 指向下一个结点的指针 */
  9. };
  10. typedef PtrToNode List; /* 定义单链表类型 */
  11. L是给定单链表,函数Reverse要返回被逆转后的链表。
  12. 裁判测试程序样例:
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. typedef int ElementType;
  16. typedef struct Node *PtrToNode;
  17. struct Node {
  18. ElementType Data;
  19. PtrToNode Next;
  20. };
  21. typedef PtrToNode List;
  22. List Read(); /* 细节在此不表 */
  23. void Print( List L ); /* 细节在此不表 */
  24. List Reverse( List L );
  25. int main()
  26. {
  27. List L1, L2;
  28. L1 = Read();
  29. L2 = Reverse(L1);
  30. Print(L1);
  31. Print(L2);
  32. return 0;
  33. }
  34. /* 你的代码将被嵌在这里 */
  35. 输入样例:
  36. 5
  37. 1 3 4 5 2
  38. 输出样例:
  39. 1
  40. 2 5 4 3 1

思路:

单链表逆转 - 图1
单链表逆转 - 图2

此时将L重新指向原来的链表的第一个位置,但原来的链表少了一个A,此时就指向了B,让temp指向下C。用代码实现就是:
Prev = L;

  1. L = Temp;
  2. Temp = L->Next;

在这里就实现两个新的链表。
单链表逆转 - 图3

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int ElementType;
  4. typedef struct Node *PtrToNode;
  5. struct Node
  6. {
  7. ElementType Data;
  8. PtrToNode Next;
  9. };
  10. typedef PtrToNode List;
  11. List Read(); /* 细节在此不表 */
  12. void Print(List L); /* 细节在此不表 */
  13. List Reverse(List L);
  14. int main()
  15. {
  16. List L1, L2;
  17. L1 = Read();
  18. L2 = Reverse(L1);
  19. Print(L1);
  20. Print(L2);
  21. return 0;
  22. }
  23. /* 建立链表 */
  24. List Read()
  25. {
  26. List head = NULL;
  27. List current;
  28. List prev = NULL;
  29. int len = 0;
  30. scanf("%d", &len);
  31. if (len == 0)
  32. return NULL;
  33. while (len--)
  34. {
  35. current = (List)malloc(sizeof(struct Node));
  36. if (head == NULL)
  37. head = current;
  38. else
  39. prev->Next = current;
  40. current->Next = NULL;
  41. scanf("%d", &current->Data);
  42. prev = current;
  43. }
  44. return head;
  45. }
  46. void Print(List L)
  47. {
  48. List p = L;
  49. List s = L;
  50. List temp;
  51. if (p == NULL)
  52. printf("NULL");
  53. else
  54. printf("\n");
  55. while (p != NULL)
  56. {
  57. printf("%d ", p->Data);
  58. p = p->Next;
  59. }
  60. }
  61. /* 你的代码将被嵌在这里 */
  62. List Reverse(List L)
  63. {
  64. if (L==NULL || L->Next == NULL)
  65. {
  66. return L;
  67. }
  68. List temp;
  69. List newList = NULL;
  70. while (L != NULL)
  71. {
  72. temp = L->Next;
  73. L->Next = newList;
  74. newList = L;
  75. L = temp;
  76. }
  77. return newList;
  78. }