您的位置:首页 > 其它

单链表的逆转

2016-04-23 17:27 295 查看
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));
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: