反转链表详解(Python)
题目描述
- 输入一个链表,反转链表后,输出新链表的表头。
分析:
先随便表画一个链表:
这个是反转后的链表,也是我们想要的:
由于链表查找元素只能从头节点开始,我们可以想到,挨个挨个的将元素的指针指向前一个元素
如果链表的长度趋于无穷大,每一次反转,将会是O(n)的复杂度,所以的总的复杂度是O(n^2).
这种方法时间复杂度太高!看下面的解法
解法详解:
通过循环来解决问题:
- (1)先定义三个指针:leftPointer、midPointer、rightPointer分别指向第一、第二、第三个节点;
- (2)让leftPointer指向空(是反转链表的尾节点):
- (3)midPointer指向leftPointer:
- (4)将三个指针同时向后移一位:
- (5)midPointer指向leftPointer(和第3步一样):
- (6)将三个指针同时向后移一位(和第4步一样):
- (7)midPointer指向leftPointer(和第3步、第5步一样):
- (8)反转链表完成,这时midPointer指针指向的就是反转链表的表头了;
边界条件:
- (1)一般的情况就是上面的步骤
- (2)头节点为None,则直接返回None
- (3)头节点指向None,反转后还是这样子,则直接返回头节点
详细代码(Python):
# class ListNode:
# def __init__(self, x): # 定义链表结构
# self.val = x
# self.next = None
class Solution:# 返回ListNodedef ReverseList(self, pHead): # pHead是初始链表的头节点if pHead == None: # 若头节点为空,则直接返回None,(边界2)return Noneif pHead.next == None: # 若头节点指向空,则直接返回头节点(边界3)return pHead# 定义三个指针leftPointer、midPointer、rightPointerleftPointer = pHead # leftPointer指向头节点 (步骤1)midPointer = pHead.next # midPointer指向头节点的下一个节点(步骤1)rightPointer = midPointer.next # rightPointer指向下下一个节点(步骤1)leftPointer.next = None # 先令leftPointer,即头节点,指向空(步骤2)while rightPointer != None: # 若指针rightPointer指向不为空,则一直遍历下去midPointer.next = leftPointer # midPointer指向前一个节点(步骤3、5)leftPointer = midPointer # leftPointer指针像后移动一位,到midPointer(步骤4、6)midPointer = rightPointer # midPointer指针像后移动一位,到rightPointer(步骤4、6)rightPointer = rightPointer.next # rightPointer指针同样向后移动一位(步骤4、6)# 循环完成后,rightPointer是指向None的,这时到达步骤6,如图很明显还没完midPointer.next = leftPointer # 将midPointer的next指向前一个节点,(步骤7)return midPointer # midPointer就是新的链表的表头了
反转链表详解(Python)相关推荐
- python链表值讲解_python数据结构之链表详解
python数据结构之链表详解 数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用 ...
- 数学建模——智能优化之遗传算法详解Python代码
数学建模--智能优化之遗传算法详解Python代码 import numpy as np import matplotlib.pyplot as plt from matplotlib import ...
- 详解 Python qrcode 二维码模块
原文链接 摘要: 详解 Python qrcode 二维码模块. 项目地址 https://github.com/lincolnloop/python-qrcode 声明 importqrcode 使 ...
- java数据结构-链表详解
文章目录 1.数据结构-链表详解 1.1单链表 1.1.1单链表节点的尾部添加 1.1.2单链表节点的自动排序添加 1.1.3单链表节点的修改 1.1.4单链表节点的删除 1.2单链表面试题 1.2. ...
- python import io_详解Python IO编程
文件读写 读文件 try: # windows下utf8 f = open('./README.md', 'r', encoding='utf8', errors='ignore') print(f. ...
- python操作目录_详解python中的文件与目录操作
详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os. ...
- scrapy爬虫储存到mysql_详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
获取要爬取的URL 爬虫前期工作 用Pycharm打开项目开始写爬虫文件 字段文件items # Define here the models for your scraped items # # S ...
- 归并排序详解(python实现)
归并排序详解(python实现) 因为上个星期leetcode的一道题(Median of Two Sorted Arrays)所以想仔细了解一下归并排序的实现.
- python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...
文件打开方式 当我们用open()函数去打开文件的时候,有好几种打开的模式. 'r'->只读 'w'->只写,文件已存在则清空,不存在则创建. 'a'->追加,写到文件末尾 'b'- ...
- python利器的使用-图文详解python开发利器之ulipad的使用实践
Ulipad是一个国人limodou编写的专业Python编辑器,它基于wxpython开发的GUI(图形化界面).下面这篇文章主要介绍了python开发利器之ulipad的使用实践,文中介绍的非常详 ...
最新文章
- 有趣的Github项目万里挑一 !(附论文、项目链接)
- 201621123028《Java程序设计》第一周学习总结
- 有道精品课python-网易词典在线翻译
- linux中EOF的用法梳理
- mac下完全卸载程序的方法
- 【c++ primer读书笔记】【第6章】函数
- Atitit 机器视觉图像处理与机器学习概论2017版 attilax著
- 邮件签名——html模板
- 如何用Camtasia制作简单动画?
- 入门级蛋白质结构查看PyMol的使用——PyMol常用命令
- ps -ef和ps -aux的区别
- HTML 关于p标签的嵌套问题
- Anaconda3 从navigator面板无法启动
- 小程序的生命周期和页面的生命周期
- 10大Android手机杀毒软件
- python期中考试试卷分析_期中考试考试试卷分析及反思
- 售价39.98万元 集度ROBO-01探月限定版追加1000体验官名额
- html5设计博客论文,基于HTML5的综合类博客设计与实现-计算机本科毕业论文
- cad转pdf怎么变成黑白?说一个办法
- ettercap内网DNS劫持实验
热门文章
- 《红周刊》独家对话芒格:你可以随自己喜欢一辈子不理性,那必然承受糟糕结果
- Rust: codewars的Molecule to atoms
- (转)今天的人工智能比肩工业革命毫不夸张
- 阿里云马涛:云原生时代的开源操作系统长什么样
- ARM正式发布v9架构,确认可供应华为,不受美国出口管制约束
- 1500页,40万字,阿里淘系技术2020技术年货来了!
- plc简易电子计算机设计,PLC-电子计算器设计.doc
- 【三维路径规划】基于matlab粒子群算法无人机山地三维路径规划【含Matlab源码 1831期】
- 【物理应用】基于Matlab GUI超声场可视化仿真模拟【含Matlab源码 1494期】
- 【优化覆盖】基于matlab粒子群算法求解传感器覆盖优化问题【含Matlab源码 1493期】