链表面试题--两种方法逆序打印单链表(栈和递归)
来源:互联网 发布:dns协议使用什么端口 编辑:程序博客网 时间:2024/06/05 20:42
方法一:
我们可以遍历链表,可是遍历链表的顺序是从头到尾,而打印(输出)链表的顺序是从尾到头。即第一个遍历到的结点最后一个输出,最后一个遍历到的结点第一个输出。这正号符合栈“先进后出”的思想,所以我们可以用栈来实现。每经过一个结点的时候,把结点放到栈中,当遍历完整个链表后,从栈顶开始逐个输出结点的值,这样就可以逆序打印出该链表了。
具体实现如下:
void List::ReversePrint2(ListNode* phead){ stack<ListNode*> s; if (NULL == phead) { return ; } else { ListNode* pCur = phead; while (pCur != NULL) { s.push(pCur); pCur = pCur->_next; } while (!s.empty()) { pCur = s.top(); cout << pCur->_value << "->"; s.pop(); } }}
方法二:
利用递归来实现,每访问到一个结点的时候,先递归输出它后面的结点,在输出该结点自身,这样也可以逆序打印出该链表。
具体实现:
void List::ReversePrint1(ListNode* phead){ if (phead!=NULL) { if (phead->_next != NULL) { ReversePrint1(phead->_next); } cout << phead->_value << "->"; }}
完整代码如下:
List.h
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<stdio.h>#include<stdlib.h>using namespace std;struct ListNode{ ListNode(int value) :_value(value) , _next(NULL) {} int _value; ListNode* _next;};class List{public: List() :phead(NULL) {} void InitNode(ListNode** phead); //尾插 void PushBack(ListNode** phead,int value); //创建新结点 ListNode* NewNode(int value); //打印链表 void Print(); //从尾到头打印链表(递归) void ReversePrint1(ListNode* phead); //从尾到头打印链表(栈) void ReversePrint2(ListNode* phead);private: ListNode* phead;};
List.cpp
#include"List.h"#include<stack>void List:: InitNode(ListNode** phead){ if (NULL != *phead) *phead = NULL;}void List:: PushBack(ListNode** phead,int value){ if (NULL == *phead) { *phead = NewNode(value); } else { ListNode* pCur = *phead; while (pCur->_next != NULL) pCur = pCur->_next; pCur->_next = NewNode(value); }}ListNode* List:: NewNode(int value){ return new ListNode(value);}void List:: Print(){ ListNode* pCur = phead; while (pCur!= NULL) { cout << pCur->_value<<"->"; pCur = pCur->_next; }}void List::ReversePrint1(ListNode* phead){ if (phead!=NULL) { if (phead->_next != NULL) { ReversePrint1(phead->_next); } cout << phead->_value << "->"; }}void List::ReversePrint2(ListNode* phead){ stack<ListNode*> s; if (NULL == phead) { return ; } else { ListNode* pCur = phead; while (pCur != NULL) { s.push(pCur); pCur = pCur->_next; } while (!s.empty()) { pCur = s.top(); cout << pCur->_value << "->"; s.pop(); } }}void test(){ List l; ListNode* phead; l.InitNode(&phead); l.PushBack(&phead,1); l.PushBack(&phead,3); l.PushBack(&phead,5); l.PushBack(&phead,7); l.PushBack(&phead,9); //l.Print(); //l.ReversePrint1(phead); l.ReversePrint2(phead);}int main(){ test(); system("pause"); return 0;}
0 0
- 链表面试题--两种方法逆序打印单链表(栈和递归)
- 链表面试题之合并有序的两个线性表-递归和非递归的方法
- 两种方法实现从尾到头打印链表--栈和递归
- 两种方法实现单向链表的创建、遍历、删除、查找、逆序输出(循环法和递归法)
- 链表面试题(一):逆序打印链表、无头链表删除插入节点、约瑟夫环、逆置单链表
- 从尾到头打印链表(五种方法包括链表翻转、递归、栈、容器逆序)
- 面试题:单链表逆置(分别用非递归和递归两种方法实现)
- 链表面试题逆序打印,删除无头非尾节点,非头位置插入,约瑟夫环,查找中间和倒数第k个节点
- 递归逆序打印单链表(c实现)
- 链表面试题--从尾到头打印单链表
- 单链表面试题之从尾到头打印单链表
- 链表面试题--从尾到头打印单链表
- 在VS和Linux下逆序打印单链表(递归和非递归)
- 单链表递归和非递归两种翻转方法(手写链表)
- 从头到尾打印链表,两种方法:用栈先进后出,另一种为递归。
- Python 使用递归打印输出数字 (逆序和顺序)
- 单链表逆序打印方法
- 采用递归逆序打印单链表(递归出口的三种写法)
- 每日代码-字符串之修改空格
- Android 使用xml的方式定义补间动画
- L2-019. 悄悄关注
- BZOJ 1461: 字符串的匹配 kmp套树状数组
- Present CodeForces
- 链表面试题--两种方法逆序打印单链表(栈和递归)
- LeetCode 1. Two Sum
- NFC--Tag读写模式java层源码分析
- python的wheel以及安装包查找
- LTE,LTE是什么意思
- jQuery选择器总结
- 三维空间中刚体的变换旋转和平移
- GO语言基础及特性
- 一个不错的shell脚本入门教程