GuangchaoSun's Blog

单链表逆转

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

函数接口定义:

List Reverse(List L);

其中List结构定义如下:

1
2
3
4
5
6
7
typedef struct Node *PtrToNode;
strut 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;
}

List Read()
{
    int len = 0;
    int num = 0;
    PtrToNode head = NULL;
    PtrToNode last = NULL;/*用于存放线性表*/

    scanf("%d",&len);
    if( 0== len){
        return NULL;
    }
    scanf("%d",&num);/*读取第一个结点*/ 
    head = (PtrToNode)malloc(sizeof(struct Node));
    head->Data = num;
    head->Next = NULL;
    last = head;
    len--;  
    while(len > 0){
        scanf("%d",&num);
        PtrToNode node = (PtrToNode)malloc(sizeof(struct Node));
        node->Data = num;
        node->Next = NULL;
        last->Next = node;
        last = node;/*将两部分连接起来*/
        len --;

    }
    return head;
}

void Print(List L){
    if(NULL == L){
        return ;
    }
    PtrToNode last = L;
    while(NULL != last){
        printf("%d ",last->Data);
        last = last->Next;
    }
    putchar('\n');

}
List Reverse(List L){
    if(NULL == L){
        return NULL;
    }
    PtrToNode listre = NULL;
    PtrToNode t = L->Next;
    if(NULL == t){/*只有一个的情况*/
        listre = L;
        return listre;
    }
    L->Next = t->Next;
    listre = t;
    t->Next = L;
    while(NULL != L->Next){
        t = L->Next;
        L->Next = t->Next;
        t->Next = listre;
        listre = t;
    }
    return listre;
}

结果:
signal_list_reverse