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中的for 循环
Jun 09 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
Jul 04 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
django之自定义软删除Model的方法
Aug 14 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
Python partial函数原理及用法解析
Dec 11 Python
Python爬虫headers处理及网络超时问题解决方案
Jun 19 Python
python 中的jieba分词库
Nov 23 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 while循环得到循环次数
2013/10/26 PHP
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
vue中监听返回键问题
2019/08/28 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
python解析模块(ConfigParser)使用方法
2013/12/10 Python
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
python实现数据写入excel表格
2018/03/25 Python
对python的文件内注释 help注释方法
2018/05/23 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
如何通过Python实现标签云算法
2019/07/02 Python
python二进制文件的转译详解
2019/07/03 Python
pandas的resample重采样的使用
2020/04/24 Python
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
小区门卫岗位职责
2013/12/31 职场文书
小孩百日宴答谢词
2014/01/15 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
新春寄语大全
2014/04/09 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
2015财务年终工作总结范文
2015/05/22 职场文书
2015年测量员工作总结
2015/05/23 职场文书
个人道歉信大全
2019/04/11 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python