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的Django框架中的数据库配置指南
Jul 17 Python
python实现给数组按片赋值的方法
Jul 28 Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 Python
python如何为创建大量实例节省内存
Mar 20 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
详解python实现交叉验证法与留出法
Jul 11 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
python实现将视频按帧读取到自定义目录
Dec 10 Python
python标准库os库的函数介绍
Feb 12 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
用python批量移动文件
Jan 14 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
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
PHP学习笔记之session
2018/05/06 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
PHP利用DWZ.CN服务生成短网址
2019/08/11 PHP
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
js获取多个tagname的节点数组
2013/09/22 Javascript
javascript操作css属性
2013/12/30 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
使用K.function()调试keras操作
2020/06/17 Python
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
会话Bean的种类
2013/11/07 面试题
EJB的激活机制
2013/10/25 面试题
村班子对照检查材料
2014/08/18 职场文书
学习考察心得体会
2014/09/04 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
教师个人教学总结
2015/02/11 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers