单链表的逆转

来源:互联网 发布:手机写码软件 编辑:程序博客网 时间:2024/05/16 08:44
1、采用c语言方法
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    char data;
    struct node *next;
}LNode;//单链表结点类型

LNode *CreateLinkList()//生成单链表
{
    LNode *head,*p,*q;
    char x;
    head=(LNode*)malloc(sizeof(LNode));//生成头结点
    head->next=NULL;
    p=head;
    q=p;//q始终指向链尾结点
    printf("Input any char string:\n");
    scanf("%c",&x);
    while(x!='\n')//生成链表的其它结点
    {
        p=(LNode*)malloc(sizeof(LNode));
        p->data=x;
        p->next=NULL;
        q->next=p;
        q=p;//q指向新的链尾
        scanf("%c",&x);
    }
    return head;//返回指向单链表的头指针head
}

void Convert(LNode *H)//单链表逆置
{
    LNode *p,*q;
    p=H->next;//p始终指向剩余结点链表的第一个数据结点
    H->next=NULL;//新链表H初始为空
    while(p!=NULL)
    {
        q=p;//从剩余结点链表中取出第一个结点
        p=p->next;//p继续指向剩余链表新的第一个数据结点
        q->next=H->next;//将取出的结点*q插入到新链表H的链首
        H->next=q;
    }
}

void print(LNode *H)//打印链表
{
 LNode *p=H->next;
 while(p!=NULL)
 {
     printf("%c ->",p->data);
     p=p->next;
 }
     printf("\n");
}

void main()
{
    LNode *A;
    A=CreateLinkList();//生成单链表A
    printf("打印输入链表:\n");
    print(A);
    printf("打印逆向链表:\n");
    Convert(A);//单链表A逆置
    print(A);
}

2.使用STL模板:
a.使用队列操作,先把原来链表从队列尾部入队,后从队列头取出,进行链表的头部插入即可实现。
#include<iostream>
#include<list>
#include<algorithm>
#include<deque>//队列

using namespace std;

list<int>  convert(list<int> ilist)//单链表逆置
{
    int length;
    deque<int> ideque;
    length=ilist.size();
    for(int i=0;i<length;++i)
    {ideque.push_back(*ilist.begin());
     ilist.pop_front();
    }
    length=ideque.size();
    for(i=0;i<length;++i)
    {
        ilist.push_front(*ideque.begin());
        ideque.pop_front();
    }
    return ilist;
}

void print(list<int> ilist)
{
 list<int>::iterator ite;
 for(ite=ilist.begin();ite!=ilist.end();++ite)
        cout<<*ite<<"->";
        cout<<endl;
}

void main()
{
    list<int> ilist;
    for(int i=1;i<10;i++)
    ilist.push_back(i);
    print(ilist);
    print(convert(ilist));
}   

b.使用栈操作,先把原来链表从头部入栈,后从栈顶取出,进行链表的尾部插入即可实现。
#include<iostream>
#include<list>
#include<algorithm>
#include<stack>//栈

using namespace std;

list<int>  convert(list<int> ilist) //单链表逆置
{
    int length;
    stack<int> istack;
    length=ilist.size();
    for(int i=0;i<length;++i)
    {istack.push(*ilist.begin());
     ilist.pop_front();
    }
    length=istack.size();
    for(i=0;i<length;++i)
    {
        ilist.push_back(istack.top());
        istack.pop();
    }
    return ilist;
}

void print(list<int> ilist)
{
 list<int>::iterator ite;
 for(ite=ilist.begin();ite!=ilist.end();++ite)
        cout<<*ite<<"->";
        cout<<endl;
}

void main()
{
    list<int> ilist;
    for(int i=1;i<10;i++)
    ilist.push_back(i);
    print(ilist);
    print(convert(ilist));
}


0 0
原创粉丝点击