九度_题目1518:反转链表

//后插法建立链表,然后从第二个元素(若有的话)开始依次插入到头结点后面从而达到反转链表的效果

题目描述:

输入一个链表,反转链表后,输出链表的所有元素。
(hint : 请务必使用链表)
输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数。
输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素。
输出:
对应每个测试案例,
以此输出链表反转后的元素,如没有元素则输出NULL。
样例输入:
5
1 2 3 4 5
0
样例输出:
5 4 3 2 1
NULL
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct LNode
{
    struct LNode *next ;
    int data;
}*Linklist;
Linklist CreateList(Linklist list,int n)
{
    int num=0;
    Linklist p=NULL,q=NULL;
    p=(Linklist)malloc(sizeof(Linklist *));
    list=p;
    p->next=NULL;
    for(int i=0;i<n;i++)
    {
        q=(Linklist)malloc(sizeof(Linklist *));
        cin>>num;
        q->data=num;
        q->next=NULL;
        p->next=q;
        p=q;
 
    }
    return list;
}
Linklist DesendList(Linklist list)
{
    Linklist p=list->next,q=p->next,s=NULL;
    p->next=NULL;
    while(q)//q指向需要插入到头结点后面的元素
    {
        s=q;
        q=q->next;
        s->next=p;
        list->next=s;
        p=s;
    }
    return list;
}
void TraveseList(Linklist list)
{
    Linklist p=list->next;
    if(p)
    {
        cout<<p->data;
        p=p->next;
    }
    else
    {cout<<"NULL"<<endl;return ;}
    while(p)
    {
        cout<<' '<<p->data;
        p=p->next;
    }
    cout<<endl;
}
int main()
{
    int n;
    while(cin>>n)
    {
        if(!n){cout<<"NULL"<<endl;continue;}
        Linklist list=NULL;
        list=CreateList( list, n);
        list=DesendList(list);
        TraveseList(list);
    }
    return 0;
}
/**************************************************************
    Problem: 1518
    User: hndxztf
    Language: C++
    Result: Accepted
    Time:250 ms
    Memory:2972 kb
****************************************************************/

你可能感兴趣的:(九度_题目1518:反转链表)