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:从尾到头打印链表每个节点的值的更多相关文章

  1. 剑指Offer-3.从尾到头打印链表(C++/Java)

    题目: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 分析: 很简单的一道题,其实也就是从尾到头打印链表,题目要求返回ArrayList,其实也就是一个数组. 可以将链表中的元素全部 ...

  2. 剑指Offer 从尾到头打印链表

    题目描述 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的“新链表”的表头 思路: 用容器vector,递归到最后一个元素,push_back到 ...

  3. 剑指offer——从尾到头打印链表节点的值

    输入一个链表,从尾到头打印链表每个节点的值. 输入描述:输入为链表的表头 输出描述:输出为需要打印的“新链表”的表头 一.问题分析 初拿到这个题目时,这应该是考察单向链表这一数据结构.单向链表的遍历总 ...

  4. 剑指Offer——从尾到头打印链表

    题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 分析: 方法1:利用栈的性质,先从头到尾遍历链表每个节点的值存入栈中,最后一个一个出栈顺序便是从尾到头的. 方法2:直接从头到尾遍历链表存储节 ...

  5. 剑指offer —— 从尾到头打印链表

    1.问题:输入一个链表,从尾到头打印链表每个节点的值. /** * public class ListNode { * int val; * ListNode next = null; * * Lis ...

  6. (CSDN迁移) 输入一个链表,从尾到头打印链表每个节点的值

    题目描述 输入一个链表,从尾到头打印链表每个节点的值. 思路1. 翻转链表,使用java自带的翻转函数或者从头到尾依次改变链表的节点指针 /** * public class ListNode { * ...

  7. 剑指Offer_6_从尾到头打印链表

    题目描述        输入应该链表的头节点 , 从尾到头反过来打印出每个节点的值.链表定义如下 : typedef struct ListNode { int m_nKey ; ListNode * ...

  8. 剑指offer--18.从尾到头打印链表

    递归,逐个加到后面 ------------------------------------------------------------------------------ 时间限制:1秒 空间限 ...

  9. 用js刷剑指offer(从尾到头打印链表)

    题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = nu ...

随机推荐

  1. OpsManage安装过程中遇到的问题和解决方案

    系统地址:https://github.com/welliamcao/OpsManage 系统:ubuntu ubuntu使用apt-get进行自动化安装 自带python2.7,不需要再次安装 1. ...

  2. js中的时间显示

    var approveTime; approveTime=new Date(da[i].approveTime).toLocaleDateString(); 结果是 xxxx年xx月xx日

  3. 【java设计模式】-01设计模式简介

    简介 设计模式(Design pattern)是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的. 设计模式是一套被反复使 ...

  4. log4j.properties log4j.xml 路径问题

  5. HTTP缓存机制和原理

    前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能.但是对于很多前端同 ...

  6. Css设置字体

    另,考虑到文件编码问题,在css中推荐使用中文字体的英文表示法,以下附常见中文字体的英文名:Mac OS的一些:Georgia  数字高低起伏Comic Sans MS 好看的英文字体华文细黑:STH ...

  7. C# List中的ForEach

    ; List<string> aaa = new List<string>(){ "aaa", "bbb" }; aaa.ForEach ...

  8. 由DBCursor的“can't switch cursor access methods”异常引发的思考

    先谈谈我是怎么用的: DBCollection dbcollection = XXXXXXXXXX(); //连接mongo DBCursor dbCursor = mergeVideoDB.find ...

  9. Java日志体系(一)发展历程

    一.日志框架的分类 门面型日志框架: JCL: Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging SL ...

  10. 树莓派-为Ubuntu Mate更换国内源 [转]

    更换步骤以root身份打开 /etc/apt/sources.list    将 http://ports.ubuntu.com/ 全部替换为中科大的源 http://mirrors.ustc.edu ...