单链表的逆序

用c++实现单链表的逆序输出。

 

题目描述:在已知单链表头节点的情况下,设计算法逆置单链表并输出

方法一:采用首先将头节点指向空,让其变为尾节点,然后利用中间节点 p、q 将其后的节点一个接一个改为指向前面的节点

 

 

#include <iostream>  
using namespace std;  
  
struct List  
{  
    int num;  
    List *next;  
};  
  
List *createList(int n)       //创建含有n个节点的单链表  
{  
    List *head, *p, *q;  
    q=head = NULL;   //初始化表头和中间指针  
    int i;  
    for (i = n; i > 0; --i)  
    {  
        p = new List;     //申请空间,创建第一个节点  
        cin >> p->num;      //往节点中存入数据信息  
        if (head == NULL)  
        {  
            head = p;  
        }  
        else  
        {  
            q->next = p;  
        }  
        q = p;  
    }  
    q->next = NULL;  
    return head;  
}  
  
List *ReverseList(List *head)          //逆置单链表  
{  
    List *p, *r;       //定义两个中间节点,用于顺移逆置链表节点  
    if (head->next == NULL)  
        return head;  
    p = head;          //获取头节点地址  
    r = p->next;       //获取链表第二个节点地址  
    p->next = NULL;    //头节点变为尾节点,原链表表头指向空  
    while (r)  
    {  
        p = r;  
        r = r->next;  
        p ->next = head;   //使第二个节点指向原先的头节点  
        head = p;          //使第二个节点变为头节点,用于循环逆置  
    }  
    return head;  
}  
  
void print(List *head)        //输出逆置后的单链表  
{  
    List *p;  
    p = head;  
    while (p)  
    {  
        cout<<p->num;  
        p = p->next;  
        cout << " ";  
    }  
    cout << endl;  
}  
int _tmain(int argc, _TCHAR* argv[])  
{  
    List *p, *q;  
    cout << "请输入单链表的节点个数:";  
    int n;  
    cin >> n;  
    cout << endl;  
    cout << "创建一个节点为" << n << "的单链表" << endl;  
    p = createList(n);  
    cout << endl;  
    cout << "这步为程序逆置单链表" << endl;  
    q = ReverseList(p);  
    cout << endl;  
    cout << "打印逆置后的单链表" << endl;  
    print(q);  
    cout << endl;  
    return 0;  
}  

 

posted @ 2016-09-27 22:17  prog123  阅读(467)  评论(0编辑  收藏  举报