#include <stdio.h>
#include <stdlib.h>

/*
---------------------
输出
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> NULL
9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0 -> NULL
---------------------
*/
typedef int ElemType;
typedef struct ListTag{
    ElemType data;
    struct ListTag * next;
}List, * PtList;

void InitList(PtList ptlist);
void show(PtList ptlist);
PtList reversed(PtList ptlist);

int main()
{
    List list, *head;
    head = &list;
    list.data = 0;
    list.next = NULL;
    InitList(head);
    show(head);

    show(reversed(head));

    return 0;
}

void InitList(PtList ptlist)
{
    PtList new_plist;
    ElemType origindata[9] = {1,2,3,4,5,6,7,8,9};
    unsigned int len = sizeof(origindata)/sizeof(ElemType);
    for(int i=0; i<len; i++)
    {
        new_plist = (PtList)malloc(sizeof(List));
        if(!new_plist)
            exit(1);
        new_plist->data = origindata[i];
        ptlist->next = new_plist;
        ptlist = new_plist;
    }
    ptlist->next = NULL;
}

void show(PtList ptlist)
{
    while(ptlist)
    {
        printf("%d -> ", ptlist->data);
        ptlist = ptlist->next;
    }
    printf("NULL");
    putchar('\n');
}

PtList reversed(PtList phead)
{
    /*反转列表*/
    if(phead==NULL || phead->next==NULL)
        exit(1);
    PtList pre = phead;//规划好各节点位置
    PtList cur = phead->next;
    PtList next;
    pre->next = NULL;//第一步 头结点指向NULL
    while(cur != NULL)
    {
        next = cur-> next;//第二步 保留next节点地址(因为cur要指向pre了而非之前的next)
        cur->next = pre;//第三步 cur指向pre
        pre = cur;//第四步 pre移动到下个节点
        cur = next;//同样 cur移动到下个节点
    }
    return pre;
}
01-25 23:17