输入一个链表的头结点,从尾到头反过来打印每个节点的值。
2016-05-02 13:48
274 查看
第一种:
先逆转链表,再依次访问。
(1)摘节点,改变原有链表结构
(2)申请空间
利用栈的先进后出特性,依次遍历链表,将链表数据依次存入栈中,然后再遍历栈
先逆转链表,再依次访问。
(1)摘节点,改变原有链表结构
(2)申请空间
#include<stdio.h> #include<stdlib.h> typedef int Datatype; typedef struct Listnode { Datatype _data; struct Listnode* _next; }Listnode; Listnode* Buynode() { Listnode* tmp=(Listnode*)malloc(sizeof(Listnode)); return tmp; } void Push(Listnode* &head,Datatype data) { Listnode* cur=head; if(cur==NULL) { cur=Buynode(); cur->_data=data; cur->_next=NULL; head=cur; } else { while(cur->_next !=NULL) { cur=cur->_next; } Listnode* tmp=NULL; tmp=Buynode(); tmp->_data=data; tmp->_next=NULL; cur->_next=tmp; } } void Pop(Listnode* head) { Listnode* cur=head; Listnode* prev=NULL; if(cur==NULL) { return ; } while(cur->_next!=NULL) { prev=cur; cur=cur->_next; } delete cur; prev->_next=NULL; cur=NULL; } void Reverse(Listnode* head) { Listnode* cur=head; Listnode* tmp=NULL; Listnode* newhead=NULL; while(cur) { tmp=cur; cur=cur->_next; tmp->_next=newhead; newhead=tmp; } while(newhead) { printf("%d\n",newhead->_data); newhead=newhead->_next; } } int main() { Listnode* head=NULL; Push(head,1); Push(head,2); Push(head,3); Push(head,4); Push(head,5); Reverse(head); system("pause"); return 0; }第二种:
利用栈的先进后出特性,依次遍历链表,将链表数据依次存入栈中,然后再遍历栈
#include<iostream> #include<stack> using namespace std; template<class T> struct Listnode { Listnode<T>(T data=0) :_data(data) ,_next(NULL) {} T _data; Listnode<T>* _next; }; template<class T> class List { public: List(Listnode<T>* head=NULL) :_head(head) { } ~List() { Listnode<T>* cur=_head; while(cur) { Listnode<T>* tmp=cur; cur=cur->_next; delete tmp; } } void Push(T data) { Listnode<T>* cur=_head; if(cur==NULL) { cur=new Listnode<T>(data); _head=cur; } else { while(cur->_next!=NULL) { cur=cur->_next; } cur->_next=new Listnode<T>(data); } } void Pop() { Listnode<T>* cur=_head; if(cur==NULL) { return; } Listnode<T>* prev=NULL; while(cur->_next!=NULL) { prev=cur; cur=cur->_next; } delete cur; prev->_next=NULL; cur=NULL; } void ReverOrderPrint() { stack<int> s; Listnode<T>* cur=_head; while(cur) { s.push(cur->_data); cur=cur->_next; } int size=s.size(); while(size--) { cout<<s.top()<<' '; s.pop(); } } private: Listnode<T> *_head; }; void test() { List<int> l; l.Push(1); l.Push(2); l.Push(3); l.Push(4); l.Push(5); l.ReverOrderPrint(); } int main() { test(); system("pause"); return 0; }第三种:递归实现
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef int Datatype; typedef struct Listnode { Datatype _data; struct Listnode* _next; }Listnode; Listnode* Buynode() { Listnode* tmp=(Listnode*)malloc(sizeof(Listnode)); return tmp; } void Push(Listnode* &head,Datatype data) { Listnode* cur=head; if(cur==NULL) { cur=Buynode(); cur->_data=data; cur->_next=NULL; head=cur; } else { while(cur->_next !=NULL) { cur=cur->_next; } Listnode* tmp=NULL; tmp=Buynode(); tmp->_data=data; tmp->_next=NULL; cur->_next=tmp; } } void Pop(Listnode* head) { Listnode* cur=head; Listnode* prev=NULL; if(cur==NULL) { return ; } while(cur->_next!=NULL) { prev=cur; cur=cur->_next; } delete cur; prev->_next=NULL; cur=NULL; } void RevOrderPrint(Listnode* head) { Listnode* cur=head; if(cur) { RevOrderPrint(cur->_next); printf("%d\n",cur->_data); } else { return; } } int main() { Listnode* head=NULL; Push(head,1); Push(head,2); Push(head,3); Push(head,4); Push(head,5); RevOrderPrint(head); system("pause"); return 0; }
相关文章推荐
- SQL中常见语句
- 设计一个类,我们只能生成该类的一个实例。
- 请实现一个函数,把字符串中的每个空格替换成“%20”。
- 冒泡排序法
- 使用Httpclient框架提交数据-get
- 【Oracle】6.JDBC
- vector
- WebView学习
- log4net 课二
- 两个栈实现一个队。
- 事件原理
- TXT有声小说
- Windows常用快捷键
- 【AKOJ】1184-ASCII码排序(2)
- 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
- 通过导航栏进入多个视图
- SpringData 学习(4)—— 使用 @Query 注解实现查询
- [从头学数学] 第202节 矩阵与变换
- c/c++在windows下获取时间和计算时间差的几种方法总结
- Oracle自定义异常的使用