题目地址:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/

题目描述

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

  1. 输入:head = [1,3,2]
  2. 输出:[2,3,1]

限制:

  • 0 <= 链表长度 <= 10000

解题方法

从尾到头打印链表,可以用 栈、递归 两种方法解决。还有一种最笨的方法:先从头到尾遍历链表放到数组中,最后再把数组进行翻转。

当使用额外空间时,从尾到头的顺序恰恰与栈的「后进先出」的顺序非常吻合。

  1. 从头到尾遍历一次链表,使用「栈」来存储链表的每个的值;
  2. 出栈的时候,得到的就是链表每个节点 从尾到头 的顺序。

C++ 代码如下:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. vector<int> reversePrint(ListNode* head) {
  12. stack<int> st;
  13. while (head) {
  14. st.push(head->val);
  15. head = head->next;
  16. }
  17. vector<int> res;
  18. while (!st.empty()) {
  19. res.push_back(st.top());
  20. st.pop();
  21. }
  22. return res;
  23. }
  24. };

Python 代码如下:

  1. # Definition for singly-linked list.
  2. # class ListNode(object):
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution(object):
  7. def reversePrint(self, head):
  8. res = collections.deque()
  9. while head:
  10. res.appendleft(head.val)
  11. head = head.next
  12. return list(res)

递归

在程序上「栈」与「递归」是对应的,因为「递归」底层就是利用了系统的「栈」实现的。这题如果不声明一个「栈」的变量的时候,则可以使用系统「栈」,即使用递归。

「从尾到头」打印链表,类似于树的「后序遍历」,所以在代码中需要先调用递归函数,再把当前节点的值放到 res 中。即:

  1. reverse(head->next);
  2. res.push_back(head->val);

上面这两句的顺序不可以反,如果反过来,那么就类似于树的「先序遍历」,得到的是「从头到尾」打印链表。

C++ 代码如下:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. vector<int> reversePrint(ListNode* head) {
  12. res.clear();
  13. reverse(head);
  14. return res;
  15. }
  16. void reverse(ListNode* head) {
  17. if (!head)
  18. return;
  19. reverse(head->next);
  20. res.push_back(head->val);
  21. }
  22. private:
  23. vector<int> res;
  24. };

数组

该做法是从头到尾把链表遍历一次,遍历的结果放到数组中。最后再把数组进行翻转。

C++ 代码如下:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. vector<int> reversePrint(ListNode* head) {
  12. vector<int> res;
  13. while (head) {
  14. res.push_back(head->val);
  15. head = head->next;
  16. }
  17. reverse(res.begin(), res.end());
  18. return res;
  19. }
  20. };

Python 代码如下:

  1. # Definition for singly-linked list.
  2. # class ListNode(object):
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution(object):
  7. def reversePrint(self, head):
  8. res = []
  9. while head:
  10. res.append(head.val)
  11. head = head.next
  12. return res[::-1]

日期

2017 年 4 月 20 日
2018 年 3 月 9 日
2021 年 7 月 31 日 —— 下周就要离职了

【剑指Offer】06. 从尾到头打印链表 解题报告(Java & python)的更多相关文章

  1. 菜鸟刷题路:剑指 Offer 06. 从尾到头打印链表

    剑指 Offer 06. 从尾到头打印链表 class Solution { public int[] reversePrint(ListNode head) { Stack<Integer&g ...

  2. 力扣 - 剑指 Offer 06. 从尾到头打印链表.md

    题目 剑指 Offer 06. 从尾到头打印链表 思路1(递归) 首先先遍历整个脸表,计算出链表的长度(用于初始化数组).然后进行递归,从链表头部递归到尾部,这期间什么都不做,直到递归到最后一个节点的 ...

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

    链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/ 标签:链表 题目 输入一个链表的头节点,从尾到头 ...

  4. 《剑指offer》从尾到头打印链表

    本题来自<剑指offer> 从尾到头打印链表 题目: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 方案一:首先遍历到尾部,然后从尾部进行到头值进行操作,后进先 ...

  5. 【Java】 剑指offer(5) 从尾到头打印链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个链表的头结点,从尾到头反过来打印出每个结点的值.结点定义如下: ...

  6. Go语言实现:【剑指offer】从尾到头打印链表

    该题目来源于牛客网<剑指offer>专题.​ 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. Go语言实现: type ListNode struct { Val int ...

  7. [剑指Offer] 3.从尾到头打印链表

    题目描述 输入一个链表,从尾到头打印链表每个节点的值. [思路]用一个vector存储,遍历链表时每次从前面插入 /** * struct ListNode { * int val; * struct ...

  8. [剑指offer]6.从尾到头打印链表+18.删除链表节点

    链表 6.从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 方法一 迭代 创建空列表res,将链表值head.val依次存进res,返回翻转后的res 代码 cl ...

  9. 剑指offer:从尾到头打印链表

    题目 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 在不改变链表结构的前提下,因为单向链表本身的结构是从头到尾的,现在用从尾到头遍历打印,可以联想到“先进后出”, 因此我 ...

随机推荐

  1. PyTools-包罗万象的python工具包

    PyTools-包罗万象的python工具包 <---点击这里获取代码,欢迎star. 自己平时写的代码都以函数方式封装起来了,方便代码复用. _________ ________ ______ ...

  2. Elasticsearch中关于transform的一个问题?

    背景:现在有一个业务,派件业务,业务员今天去派件(扫描产生一条派件记录),派件可能会有重复派件的情况,第二天再派送(记录被更新,以最新的派件操作为准).现在需要分业务员按天统计每天的派件数量.es版本 ...

  3. TCP的慢启动、拥塞避免、重传、快恢复乱七八糟总是记不清?11个连环问让你一次性打通任督二脉

    摘要:如果你的开发过程涉及数据传输,一直在重传.超时之类的方案里有困惑的话,不妨重新学一学可靠性最精致的TCP协议. 本文分享自华为云社区<TCP的慢启动.拥塞避免.重传.快恢复乱七八糟总是记不 ...

  4. A Child's History of England.23

    King William, fearing he might lose his conquest, came back, and tried to pacify the London people b ...

  5. JAVA中的六种日期类型使用

    基本的6种日期类 /** * 六种时间类型的类 * 数据库格式的时间三种格式 */ java.util.Date date = new java.util.Date();//年与日时分秒 //数据库的 ...

  6. Linux学习 - 网络命令

    一.write 1 功能 给指定在线用户发信息,以Ctrl + D保存结束 2 语法 write  <用户名>  [信息] 二.wall(write all) 1 功能 给所有在线用户发送 ...

  7. OpenStack之三: 安装MySQL,rabbitmq, memcached

    官网地址:https://docs.openstack.org/install-guide/environment-sql-database-rdo.html #:安装mysql [root@mysq ...

  8. mysql之对象创建

    1 --创建表空间 2 create tablespace tablespace_name 3 innodb and ndb: 4 add datafile 'file_name' 5 innodb ...

  9. JFinal之ActiveRecord开发示例

    JFinal独创Db + Record模式示例 JFinal配备的ActiveRecord插件,除了实现了类似Rails ActiveRecrod的功能之外,还实现了Db + Record模式,此模式 ...

  10. django搭建示例-ubantu环境

    python3安装--------------------------------------------------------------------------- 最新的django依赖pyth ...