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 相关文章推荐
python实现的udp协议Server和Client代码实例
Jun 04 Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
python利用requests库模拟post请求时json的使用教程
Dec 07 Python
用python打印菱形的实操方法和代码
Jun 25 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
python多进程下的生产者和消费者模型
May 07 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
如何理解Python中包的引入
May 29 Python
树莓派升级python的具体步骤
Jul 05 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
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
php Hex RGB颜色值互换的使用
2013/05/10 PHP
PHP发送短信代码分享
2015/08/11 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
详解Python中的测试工具
2019/06/09 Python
YUV转为jpg图像的实现
2019/12/09 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
WSDL的操作类型主要有几种
2013/07/19 面试题
药学专业毕业生求职信
2013/10/20 职场文书
自荐书4要点
2014/01/25 职场文书
勤俭节约倡议书
2014/04/14 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
运动会表扬稿范文
2015/05/05 职场文书
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL