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新手实现2048小游戏
Mar 31 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
详解python里的命名规范
Jul 16 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
python微元法计算函数曲线长度的方法
Nov 08 Python
python分别打包出32位和64位应用程序
Feb 18 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
python如何求圆的面积
Jul 01 Python
详解python程序中的多任务
Sep 16 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 Python
安装不同版本的tensorflow与models方法实现
Feb 20 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
无线电的诞生过程
2021/03/01 无线电
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
js实现简单页面全屏
2019/09/17 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
JavaScript实现打字游戏
2021/02/19 Javascript
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
Python的垃圾回收机制详解
2019/08/28 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
Python的in,is和id函数代码实例
2020/04/18 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
详解python with 上下文管理器
2020/09/02 Python
文秘专业自荐信
2013/10/14 职场文书
考试作弊被抓检讨书
2014/01/10 职场文书
两年的个人工作自我评价
2014/01/10 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
垂直极限观后感
2015/06/08 职场文书
毕业典礼致辞
2015/07/29 职场文书
新学期开学寄语2016
2015/12/04 职场文书
MySQL插入数据与查询数据
2022/03/25 MySQL
Python实现自动玩连连看的脚本分享
2022/04/04 Python
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android