目录

  • 1、题目描述:
  • 2、方法一:使用栈保存结果
    • 思路:
    • 代码(迭代法):
    • 代码(递归法):
  • 3、方法二:反转链表
    • 思路:
    • 代码:
  • 4、方法三:保存数组,再反转数组
    • 思路:
    • 代码:
  • 5、总结:

1、题目描述:

看到这道题,很多人的想法是:遍历一遍链表,遍历的时候把每个节点的值用一个数组保存,最后再把数组反转就可以了。

当然,还有一些人是这么想的:先把链表的指针反转过来,然后再从头遍历保存到数组中,就完成了题目。

上面的思路都是可以的,但是在面试的时候我们应该要问清楚面试官,链表可不可以修改。下面按这两种思路做一下这道题(python3编写)。

2、方法一:使用栈保存结果

思路:

这道题目肯定是要遍历链表的,遍历的顺序是从头到尾,可输出的顺序却是从尾到头,这是典型的后进先出,因此可以使用栈来保存结果。具体操作如下:

遍历链表,然后把每个结果压入栈中。当遍历完链表后,再从栈中开始逐个取输出节点的值,此时的输出就已经是反转后的结果了。

代码(迭代法):

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def reversePrint(self, head: ListNode) -> List[int]:stack = [] # 用列表充当栈cur = head # 当前要遍历的节点while cur != None:stack.append(cur.val) # 当前节点的值入栈cur = cur.next # 节点后移res = [] # leetcode要求数组返回,按剑指这个不计入空间复杂度中while stack:res.append(stack.pop()) # 出栈保存到列表里return res

代码(递归法):

面试官看这么容易写出来了,然后要求你再使用递归法写一下,要是没做过,那不是懵逼了么。

既然想到了用栈来实现这个函数,而递归的本质就是一个栈结构,于是很自然的就可以想到用递归实现。要实现反过来输出链表,我们每访问到一个节点的时候,先递归输出它后面的节点,再输出该节点自身,这样链表的输出结果就反过来了。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def reversePrint(self, head: ListNode) -> List[int]:def deep(cur):if cur != None:deep(cur.next) # 向后递归遍历res.append(cur.val) # 递归最后一层,则保存结果res = [] # 保存结果的列表deep(head)return res

3、方法二:反转链表

思路:

先把链表反转(这其实又是一道题:链表反转),然后再遍历一遍链表,则就是最终的结果。

反转链表记得先定义一个前驱指针指向None,然后依次向后反转,细节在代码中。注意:最后的pre就是链表的头。

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def reversePrint(self, head: ListNode) -> List[int]:pre = None # 前驱节点,初始指向空cur = head # 当前要遍历的节点while cur != None:temp = cur.next # 暂存cur的下一个节点,不然就找不到了cur.next = pre # 然后让cur的指针指向它的前一个节点# 后移俩节点pre = curcur = tempres = [] # 保存结果while pre != None: # 再遍历一遍,保存结果res.append(pre.val)pre = pre.nextreturn res

4、方法三:保存数组,再反转数组

思路:

还有一种思路是,先遍历一遍链表,遍历的时候保存到数组中,然后把数组反转就是最终的结果了。

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def reversePrint(self, head: ListNode) -> List[int]:res = [] # 保存结果的数组while head != None:res.append(head.val) # 先保存结果head = head.next# 再反转数组,这里我使用三种方法:# 1.左右指针left, right = 0, len(res)-1while left < right:res[left], res[right] = res[right], res[left] # 左右指针的值交换left += 1right -= 1# 2.使用python3的切片# res = res[::-1]# 3.使用python3中列表的reverse()方法# res.reverse()return res

5、总结:

剑指offer的每一道题,其实一定要好好琢磨,不能随便用一种方法做一下就完事了,这样真的没有什么实质性的作用。

剑指 Offer 06. 从尾到头打印链表(python3编写)相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java

    <LeetCode力扣练习>剑指 Offer 06. 从尾到头打印链表 Java 一.资源 题目: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入: ...

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

    剑指 Offer 06. 从尾到头打印链表 Ideas 遍历链表,每次在vector的头部insert当前元素值. Code C++ class Solution {public:vector< ...

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

    [LeetCode]剑指 Offer 06. 从尾到头打印链表 文章目录 [LeetCode]剑指 Offer 06. 从尾到头打印链表 一.笨比解法 二.递归法 三.辅助栈法 总结 一.笨比解法 算 ...

  4. 【三种解法】剑指 Offer 06. 从尾到头打印链表【附完整可运行代码】

    立志用最少的代码做最高效的表达 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表 ...

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

    1.问题描述 输入一个链表的头结点,按链表值从尾到头的顺序返回一个ArrayList. 2. 解决思路 由于是反向打印,所以是一个"后进先出"的问题,使用栈来解决,虽然递归的本质就 ...

  6. Leetcode 240.剑指 Offer 06. 从尾到头打印链表 (每日一题 20210728)

    输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回).示例 1:输入:head = [1,3,2] 输出:[2,3,1]限制:0 <= 链表长度 <= 10000题目地址:h ...

  7. 剑指 Offer 06. 从尾到头打印链表(C语言)

    *输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000* ...

  8. 剑指 Offer 06. 从尾到头打印链表(递归、逆置链表、头部动态插入)

    题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 1000 ...

  9. 【算法】剑指 Offer 06. 从尾到头打印链表

    1.概述 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof 输入一个链表的头节点,从尾到头反过来返回 ...

最新文章

  1. java person抽象类_java 抽象类
  2. 为了我心中的女神,我竟然转行做了程序员
  3. mysql5.6.27_Centos上安装Mysql5.6.27多实例
  4. as工程放到源码编译_Android 7.1源码编译导入AS完整教程
  5. 初次使用Shiro进行加密密码的算法实例
  6. 【渝粤教育】国家开放大学2018年秋季 2006T经济数学基础12 参考试题
  7. 百度SEO站群404二次元时间倒计时页面源码
  8. 单自由度振动全解:matlab理论计算 virtual.lab motion仿真Excite PU仿真
  9. Spring Boot开发
  10. 生物技术制药课程文献调研报告撰写说明
  11. jQuery制作带有微信二维码扫描的页面返回顶部代码
  12. SQL刷题:排名的问题
  13. c/c++文本单词查询
  14. 微信小程序怎么开通(自己申请开通微信小程序的方法)
  15. android 抠图功能吗,抠图宝(抠图宝.和图)V10.01 安卓版
  16. 输入一行英文句子,统计其中的单词个数。例如,输入”How are you.”,则输出3。
  17. import scipy.io as sio报错:ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4
  18. SSD-2(代码部分介绍)
  19. 海康威视新手上路:MFC连接球机
  20. 课时19:函数:我的地盘听我的

热门文章

  1. sklearn实战-----5.逻辑回归与评分卡
  2. MySQL初级练习题
  3. 华为防火墙基础自学系列 | Site to Site IPSec VdPdNd
  4. INS-32042 安装程序检测到用户oracle 不是主产品清单组成员
  5. java写的酷炫项目_基于RxJava实现酷炫启动页
  6. VMware虚拟机网络设置简介
  7. SpringMVC源代码学习外传(三)RequestCondition
  8. 【数据恢复】重建分区表恢复文件-恢复diskpart clean
  9. CG100、CGDI、CGPRO区别介绍
  10. AMD发布22.10.1驱动,支持《守望先锋2》