4-1 单链表逆转

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

List Reverse( List L );

其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

L是给定单链表,函数Reverse要返回被逆转后的链表。

裁判测试程序样例:

#include 
#include 

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
#include
#include

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;

    printf("pleasr enter the length of the list:\n");
    scanf_s("%d", &len);

    if (len == 0)   return NULL;

    while (len--) {
        current = (List)malloc(sizeof(struct Node));
        if (head == NULL)
            head = current;
        else
            prev->Next = current;
        current->Next = NULL;
        scanf_s("%d", ¤t->Data);
        prev = current;
    }
    return head;
}

/* 输出链表 */
void Print(List L)
{
    List p = L;
    List s = L;
    List temp;
    if (p == NULL)
        printf("NULL");
    else
        printf("the List is:\n");
    while (p != NULL) {
        printf("%d ", p->Data);
        p = p->Next;
    }

    ///* 释放内存 */
    //while(s!=NULL){
    //temp=s->Next;
    //free(s);
    //s=temp;
    //}
}

/* 
    链表反转 
    思路:每次都将原第一个结点之后的那个结点放在新的表头后面。 
    比如head,1,2,3,4,5 
    第一次:把第一个结点1后边的结点2放到新表头后面,变成head,2,1,3,4,5 
    第二次:把第一个结点1后边的结点3放到新表头后面,变成head,3,2,1,4,5 
    …… 
    直到: 第一个结点1,后边没有结点为止。 
*/
List Reverse(List L)
{
    List head;
    List temp;
    List first;

    if(L==NULL) return NULL;

    head=(List)malloc(sizeof(struct Node));
    head->Next=L; //总的头节点,此指针节点是固定不动的

    first=L;
    while(first->Next!=NULL){
        temp=first->Next;   //保存下L后的节点
        first->Next=temp->Next;     //将temp节点鼓励出来
        temp->Next=head->Next;      //temp节点插在head后面
        head->Next=temp;        //head节点接在temp上
    }
    return head->Next;
}

链表的反转属于基础但是重要的题目,这块也是卡了好久,借鉴了许多别人的博客,程序中关于内存释放那块存在问题。

你可能感兴趣的:(4-1 单链表逆转)