剑指 Offer 06. 从尾到头打印链表(python3编写)
目录
- 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编写)相关推荐
- 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java
<LeetCode力扣练习>剑指 Offer 06. 从尾到头打印链表 Java 一.资源 题目: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入: ...
- LeetCode Algorithm 剑指 Offer 06. 从尾到头打印链表
剑指 Offer 06. 从尾到头打印链表 Ideas 遍历链表,每次在vector的头部insert当前元素值. Code C++ class Solution {public:vector< ...
- 【LeetCode】剑指 Offer 06. 从尾到头打印链表
[LeetCode]剑指 Offer 06. 从尾到头打印链表 文章目录 [LeetCode]剑指 Offer 06. 从尾到头打印链表 一.笨比解法 二.递归法 三.辅助栈法 总结 一.笨比解法 算 ...
- 【三种解法】剑指 Offer 06. 从尾到头打印链表【附完整可运行代码】
立志用最少的代码做最高效的表达 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表 ...
- 剑指offer 06. 从尾到头打印链表
1.问题描述 输入一个链表的头结点,按链表值从尾到头的顺序返回一个ArrayList. 2. 解决思路 由于是反向打印,所以是一个"后进先出"的问题,使用栈来解决,虽然递归的本质就 ...
- Leetcode 240.剑指 Offer 06. 从尾到头打印链表 (每日一题 20210728)
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回).示例 1:输入:head = [1,3,2] 输出:[2,3,1]限制:0 <= 链表长度 <= 10000题目地址:h ...
- 剑指 Offer 06. 从尾到头打印链表(C语言)
*输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000* ...
- 剑指 Offer 06. 从尾到头打印链表(递归、逆置链表、头部动态插入)
题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 1000 ...
- 【算法】剑指 Offer 06. 从尾到头打印链表
1.概述 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof 输入一个链表的头节点,从尾到头反过来返回 ...
最新文章
- java person抽象类_java 抽象类
- 为了我心中的女神,我竟然转行做了程序员
- mysql5.6.27_Centos上安装Mysql5.6.27多实例
- as工程放到源码编译_Android 7.1源码编译导入AS完整教程
- 初次使用Shiro进行加密密码的算法实例
- 【渝粤教育】国家开放大学2018年秋季 2006T经济数学基础12 参考试题
- 百度SEO站群404二次元时间倒计时页面源码
- 单自由度振动全解:matlab理论计算 virtual.lab motion仿真Excite PU仿真
- Spring Boot开发
- 生物技术制药课程文献调研报告撰写说明
- jQuery制作带有微信二维码扫描的页面返回顶部代码
- SQL刷题:排名的问题
- c/c++文本单词查询
- 微信小程序怎么开通(自己申请开通微信小程序的方法)
- android 抠图功能吗,抠图宝(抠图宝.和图)V10.01 安卓版
- 输入一行英文句子,统计其中的单词个数。例如,输入”How are you.”,则输出3。
- import scipy.io as sio报错:ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4
- SSD-2(代码部分介绍)
- 海康威视新手上路:MFC连接球机
- 课时19:函数:我的地盘听我的
热门文章
- sklearn实战-----5.逻辑回归与评分卡
- MySQL初级练习题
- 华为防火墙基础自学系列 | Site to Site IPSec VdPdNd
- INS-32042 安装程序检测到用户oracle 不是主产品清单组成员
- java写的酷炫项目_基于RxJava实现酷炫启动页
- VMware虚拟机网络设置简介
- SpringMVC源代码学习外传(三)RequestCondition
- 【数据恢复】重建分区表恢复文件-恢复diskpart clean
- CG100、CGDI、CGPRO区别介绍
- AMD发布22.10.1驱动,支持《守望先锋2》