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搭建简易服务器分析与实现
Dec 15 Python
使用python获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
Python实现将HTML转换成doc格式文件的方法示例
Nov 20 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
简单了解Django应用app及分布式路由
Jul 24 Python
Django命名URL和反向解析URL实现解析
Aug 09 Python
Django REST Framework之频率限制的使用
Sep 29 Python
Python列表切片常用操作实例解析
Dec 16 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
python程序的组织结构详解
Dec 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
PHP高级编程实例:编写守护进程
2014/09/02 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
JS实现兼容性较好的随屏滚动效果
2015/11/09 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
详解AngularJS中的filter过滤器用法
2016/01/04 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
详解用python写一个抽奖程序
2019/05/10 Python
Python跳出多重循环的方法示例
2019/07/03 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
Python调用jar包方法实现过程解析
2020/08/11 Python
pycharm实现猜数游戏
2020/12/07 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
世界上最好的足球商店:Unisport
2019/03/02 全球购物
小学生期末评语
2014/04/21 职场文书
初中班主任评语
2014/04/24 职场文书
通信工程求职信
2014/07/16 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
伏羲庙导游词
2015/02/09 职场文书
行政处罚决定书
2015/06/24 职场文书
cf战队宣传语
2015/07/13 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书