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实现在sqlite动态创建表的方法
May 08 Python
Linux下用Python脚本监控目录变化代码分享
May 21 Python
基于Python和Scikit-Learn的机器学习探索
Oct 16 Python
Python编程求质数实例代码
Jan 31 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
python筛选出两个文件中重复行的方法
May 31 Python
Python Matplotlib实现三维数据的散点图绘制
Mar 19 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
Jul 06 Python
python读写csv文件的方法
Aug 13 Python
python使用matplotlib绘制雷达图
Oct 18 Python
总结三种用 Python 作为小程序后端的方式
May 02 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
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
php微信开发之关注事件
2018/06/14 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
ES6 十大特性简介
2020/12/09 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
Python中用sleep()方法操作时间的教程
2015/05/22 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
Python 日期与时间转换的方法
2020/08/01 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
店长助理岗位职责
2013/12/13 职场文书
党支部公开承诺书
2014/03/28 职场文书
竞选学生会主席演讲稿
2014/04/24 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
薪资证明范本
2015/06/19 职场文书
《鲸》教学反思
2016/02/23 职场文书
详解MindSpore自定义模型损失函数
2021/06/30 Python
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
SQL Server中搜索特定的对象
2022/05/25 SQL Server