python算法题 链表反转详解


Posted in Python onJuly 02, 2019

链表的反转是一个很常见、很基础的数据结构题,输入一个单向链表,输出逆序反转后的链表,如图:上面的链表转换成下面的链表。实现链表反转有两种方式,一种是循环迭代,另外一种方式是递归。

python算法题 链表反转详解

第一种方式:循坏迭代

循坏迭代算法需要三个临时变量:pre、head、next,临界条件是链表为None或者链表就只有一个节点。

# encoding: utf-8
class Node(object):
def __init__(self):
self.value = None
self.next = None
def __str__(self):
return str(self.value)
def reverse_loop(head):
if not head or not head.next:
return head
pre = None 
while head:
next = head.next # 缓存当前节点的向后指针,待下次迭代用
head.next = pre # 这一步是反转的关键,相当于把当前的向前指针作为当前节点的向后指针
pre = head # 作为下次迭代时的(当前节点的)向前指针
head = next # 作为下次迭代时的(当前)节点
return pre # 返回头指针,头指针就是迭代到最后一次时的head变量(赋值给了pre)

测试一下:

if __name__ == '__main__':
three = Node()
three.value = 3
two = Node()
two.value = 2
two.next = three
one = Node()
one.value = 1
one.next = two
head = Node()
head.value = 0
head.next = one
newhead = reverse_loop(head)
while newhead:
print(newhead.value, )
newhead = newhead.next

输出:

3
2
1
0
2

python算法题 链表反转详解

第二种方式:递归

递归的思想就是:

head.next = None
head.next.next = head.next
head.next.next.next = head.next.next
...
...

head的向后指针的向后指针转换成head的向后指针,依此类推。

实现的关键步骤就是找到临界点,何时退出递归。当head.next为None时,说明已经是最后一个节点了,此时不再递归调用。

def reverse_recursion(head):
if not head or not head.next:
return head
new_head = reverse_recursion(head.next)
head.next.next = head
head.next = None
return new_head

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pyside写ui界面入门示例
Jan 22 Python
Python基本语法经典教程
Mar 11 Python
Python使用三种方法实现PCA算法
Dec 12 Python
pandas修改DataFrame列名的方法
Apr 08 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 Python
对Python信号处理模块signal详解
Jan 09 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
python对文件目录的操作方法实例总结
Jun 24 Python
Python 硬币兑换问题
Jul 29 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
详解Python中*args和**kwargs的使用
Apr 07 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
Apr 24 Python
python输入多行字符串的方法总结
Jul 02 #Python
Django高级编程之自定义Field实现多语言
Jul 02 #Python
python 杀死自身进程的实现方法
Jul 01 #Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 #Python
PyCharm-错误-找不到指定文件python.exe的解决方法
Jul 01 #Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 #Python
简单了解python中对象的取反运算符
Jul 01 #Python
You might like
对盗链说再见...
2006/10/09 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
JavaScript类和继承 this属性使用说明
2010/09/03 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
python 多线程应用介绍
2012/12/19 Python
python实现的udp协议Server和Client代码实例
2014/06/04 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
python正则表达式re之compile函数解析
2017/10/25 Python
Python格式化日期时间操作示例
2018/06/28 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
美国老牌主机服务商:iPage
2016/07/22 全球购物
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
Java模拟试题
2014/11/10 面试题
个人担保书格式范文
2014/05/12 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
接收函格式
2015/01/30 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
MySQL限制查询和数据排序介绍
2022/03/25 MySQL