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 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
用Python创建声明性迷你语言的教程
Apr 13 Python
Python学习入门之区块链详解
Jul 25 Python
Python学生成绩管理系统简洁版
Apr 05 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
Apr 26 Python
Python实现正整数分解质因数操作示例
Aug 01 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
利用Python实现kNN算法的代码
Aug 16 Python
flask 实现token机制的示例代码
Nov 07 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
解决pycharm修改代码后第一次运行不生效的问题
Feb 06 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
利用js调用后台php进行数据处理原码
2006/10/09 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
date.parse在IE和FF中的区别
2010/07/29 Javascript
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python探索之修改Python搜索路径
2017/10/25 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
python单例模式的多种实现方法
2019/07/26 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
python实现canny边缘检测
2020/09/14 Python
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
公司司机岗位职责
2014/02/07 职场文书
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL