剑指offer3:从尾到头打印链表每个节点的值
1. 题目描述
输入一个链表,从尾到头打印链表每个节点的值。
2. 思路和方法
2.1 推荐的方法
(1)栈,循环
后进先出,我们可以用栈实现这种顺序。每经过一个结点的时候,把该节点放到一个栈里面,当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。
2.2 不推荐的方法
(1)直接修改输入数据
如果可以修改原来链表的结构,那么把链表中链接结点的指针反转过来,改变链表的方向,然后就可以从头到尾输出了。
但是,打印通常是一个只读操作,我们不希望打印时修改内容,所以就得想别的办法。
(2)递归
递归在本质上就是一个栈结构,于是很自然地又想到了用递归来实现。每访问到一个结点的时候,先递归输出它后面的节点,再输出该节点自身,这样链表的输出结果就反过来了。
3. 核心代码
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
stack<int> nodes;
ListNode* pNode = head;
while (pNode != NULL){
nodes.push(pNode->val);
pNode = pNode->next;
}
while (!nodes.empty()){
result.push_back(nodes.top());
nodes.pop();
}
return result;
}
};
4. C++完整测试
#include<iostream>
#include<string>
#include <vector>
#include<stack> using namespace std; struct ListNode
{
char val;
ListNode* next;
}; void createlist(ListNode *&head)
{
ListNode *p = head;
while ()
{
char s;
cin >> s;
if (s != '#')
{
ListNode *newnode = new ListNode;
newnode->val = s;
newnode->next = NULL;
if (head == NULL)
{
head = newnode;
p = head;
}
else
{
p->next = newnode;//往p后面添加新节点
p = newnode;//最后一个节点变成新节点
}
}
else
{
break;
}
}
} class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
stack<int> nodes; ListNode* pNode = head;
while (pNode != NULL){
nodes.push(pNode->val);
pNode = pNode->next;
}
while (!nodes.empty()){
result.push_back(nodes.top()); // pop是弹出栈顶元素,top是获得栈顶元素,不弹出
nodes.pop();
}
return result;
}
}; int main()
{
Solution a;
ListNode *head = NULL;
createlist(head);
cout << "---------打印原始字符串序列!----------" << endl;
ListNode * p = head;
while (p != NULL)
{
// if (p == head)
// cout << p->val;
// else
// cout << " " << p->val;
cout << p->val;
p = p->next;
}
cout << endl;
cout << "--------打印原始字符串序列!----------" << endl; cout << "--------逆序打印----------" << endl;
vector<int> res;
res = a.printListFromTailToHead(head); //输出全部元素
vector<int>::iterator it;
for (it = res.begin(); it != res.end(); it++)
{
cout << (char)*it << " "; //vector int 转换为 char类型
}
cout << endl;
system("pause");
return ;
}
参考资料
https://blog.csdn.net/u011475210/article/details/78106191
https://blog.csdn.net/u011275956/article/details/51321028
https://blog.csdn.net/slandarer/article/details/91863177(链表详解)
剑指offer3:从尾到头打印链表每个节点的值的更多相关文章
- 剑指Offer-3.从尾到头打印链表(C++/Java)
题目: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 分析: 很简单的一道题,其实也就是从尾到头打印链表,题目要求返回ArrayList,其实也就是一个数组. 可以将链表中的元素全部 ...
- 剑指Offer 从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的“新链表”的表头 思路: 用容器vector,递归到最后一个元素,push_back到 ...
- 剑指offer——从尾到头打印链表节点的值
输入一个链表,从尾到头打印链表每个节点的值. 输入描述:输入为链表的表头 输出描述:输出为需要打印的“新链表”的表头 一.问题分析 初拿到这个题目时,这应该是考察单向链表这一数据结构.单向链表的遍历总 ...
- 剑指Offer——从尾到头打印链表
题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 分析: 方法1:利用栈的性质,先从头到尾遍历链表每个节点的值存入栈中,最后一个一个出栈顺序便是从尾到头的. 方法2:直接从头到尾遍历链表存储节 ...
- 剑指offer —— 从尾到头打印链表
1.问题:输入一个链表,从尾到头打印链表每个节点的值. /** * public class ListNode { * int val; * ListNode next = null; * * Lis ...
- (CSDN迁移) 输入一个链表,从尾到头打印链表每个节点的值
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 思路1. 翻转链表,使用java自带的翻转函数或者从头到尾依次改变链表的节点指针 /** * public class ListNode { * ...
- 剑指Offer_6_从尾到头打印链表
题目描述 输入应该链表的头节点 , 从尾到头反过来打印出每个节点的值.链表定义如下 : typedef struct ListNode { int m_nKey ; ListNode * ...
- 剑指offer--18.从尾到头打印链表
递归,逐个加到后面 ------------------------------------------------------------------------------ 时间限制:1秒 空间限 ...
- 用js刷剑指offer(从尾到头打印链表)
题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = nu ...
随机推荐
- MySQL树
树 树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合.把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的. 它具有以下的特点:每个结点有零个 ...
- 阿里云修改主机名hostname
一.永久修改主机名的方法(针对于普通的服务器) 1.通过hostname命令修改. [root@izwz9f7pm0tw36neb1j7gmz ~]# hostname node1 修改完之后发现主机 ...
- QT .pro文件中的变量说明
https://blog.csdn.net/tanou3212/article/details/79942840 TEMPLATE:定义了工程的编译模式 赋值方式为:TEMPLATE=app (1 ...
- centos 下 安装vim
我们在安装完Centos后,它默认的是安装了VI编辑器,VIM是没有安装的,所以我们在使用vim test.txt时会提示: vim command not found ... 这就是说明我们的Lin ...
- P4095 [HEOI2013]Eden 的新背包问题
P4095 [HEOI2013]Eden 的新背包问题 题解 既然假定第 i 个物品不可以选,那么我们就设置两个数组 dpl[][] 正序选前i个物品,dpr[][] 倒序选前i个物品 ,价格不超过 ...
- Scrapy教程——搭建环境、创建项目、爬取内容、保存文件
1.创建项目 在开始爬取之前,您必须创建一个新的Scrapy项目.进入您打算存储代码的目录中,运行新建命令. 例如,我需要在D:\00Coding\Python\scrapy目录下存放该项目,打开命令 ...
- Scala语法03 - 函数
- Scala安装配置和使用
- HBase管理与监控——HBase region is not online
发现有些regison程序操作失败,其他region 都是正常的,重启regionserver 后依然报同样的错误. 首先进入hbase的bin目录,执行下面命令检查表是否有存储一致性问题: hbas ...
- OSS上传图片demo
demo整理来源https://help.aliyun.com/document_detail/32011.html /** * 示例说明 * <p> * HelloOSS是OSS Jav ...
