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使用Berkeley DB数据库实例
Sep 26 Python
Python中decorator使用实例
Apr 14 Python
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
python使用tkinter实现简单计算器
Jan 30 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
python中的协程深入理解
Jun 10 Python
Python基础之函数原理与应用实例详解
Jan 03 Python
pyCharm 实现关闭代码检查
Jun 09 Python
Python提取视频中图片的示例(按帧、按秒)
Oct 22 Python
Python常用断言函数实例汇总
Nov 30 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中使用XML
2006/10/09 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
js图片轮播特效代码分享
2015/09/07 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
Python写的一个简单DNS服务器实例
2014/06/04 Python
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
python实现解数独程序代码
2017/04/12 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
python tornado使用流生成图片的例子
2019/11/18 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
详解python 内存优化
2020/08/17 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
StringBuilder和String的区别
2015/05/18 面试题
remote接口和home接口主要作用
2013/05/15 面试题
竞聘演讲稿范文
2014/01/12 职场文书
年度考核评语
2014/01/19 职场文书
融资租赁计划书
2014/04/29 职场文书
职工年度考核评语
2014/12/31 职场文书
2015年教师节活动总结
2015/03/20 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
2016年寒假家长评语
2015/10/10 职场文书
2016继续教育研修日志
2015/11/13 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android