用python介绍4种常用的单链表翻转的方法小结


Posted in Python onFebruary 24, 2020

如何把一个单链表进行反转?

方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。

方法2:使用3个指针遍历单链表,逐个链接点进行反转。

方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。

方法4: 递归(相信我们都熟悉的一点是,对于树的大部分问题,基本可以考虑用递归来解决。但是我们不太熟悉的一点是,对于单链表的一些问题,也可以使用递归。可以认为单链表是一颗永远只有左(右)子树的树,因此可以考虑用递归来解决。或者说,因为单链表本身的结构也有自相似的特点,所以可以考虑用递归来解决)

开辟辅助数组,新建表头反转,就地反转,递归反转

# -*- coding: utf-8 -*-
'''
链表逆序
'''
class ListNode: 
  def __init__(self,x): 
    self.val=x
    self.next=None
 
'''
第一种方法:
对于一个长度为n的单链表head,用一个大小为n的数组arr储存从单链表从头
到尾遍历的所有元素,在从arr尾到头读取元素简历一个新的单链表
时间消耗O(n),空间消耗O(n)
'''   
def reverse_linkedlist1(head):
  if head == None or head.next == None: #边界条件
    return head
  arr = [] # 空间消耗为n,n为单链表的长度
  while head:
    arr.append(head.val)
    head = head.next
  newhead = ListNode(0)
  tmp = newhead
  for i in arr[::-1]:
    tmp.next = ListNode(i)
    tmp = tmp.next
  return newhead.next
 
'''
开始以单链表的第一个元素为循环变量cur,并设置2个辅助变量tmp,保存数据;
newhead,新的翻转链表的表头。
时间消耗O(n),空间消耗O(1)
'''
 
def reverse_linkedlist2(head):
  if head == None or head.next == None: #边界条件
    return head
  cur = head #循环变量
  tmp = None #保存数据的临时变量
  newhead = None #新的翻转单链表的表头
  while cur:
    tmp = cur.next
    cur.next = newhead
    newhead = cur  # 更新 新链表的表头
    cur = tmp
  return newhead
   
'''
开始以单链表的第二个元素为循环变量,用2个变量循环向后操作,并设置1个辅助变量tmp,保存数据;
时间消耗O(n),空间消耗O(1)
'''
 
 
def reverse_linkedlist3(head):
  if head == None or head.next == None: #边界条件
    return head
  p1 = head #循环变量1
  p2 = head.next #循环变量2
  tmp = None #保存数据的临时变量
  while p2:
    tmp = p2.next
    p2.next = p1
    p1 = p2
    p2 = tmp
  head.next = None
  return p1
 
'''
递归操作,先将从第一个点开始翻转转换从下一个节点开始翻转
直至只剩一个节点
时间消耗O(n),空间消耗O(1)
'''
 
def reverse_linkedlist4(head):
  if head is None or head.next is None:
    return head
  else:
    newhead=reverse_linkedlist4(head.next)
    head.next.next=head
    head.next=None
  return newhead
 
     
def create_ll(arr):
  pre = ListNode(0)
  tmp = pre
  for i in arr:
    tmp.next = ListNode(i)
    tmp = tmp.next
  return pre.next
   
def print_ll(head):
  tmp = head
  while tmp:
    print tmp.val
    tmp=tmp.next
 
a = create_ll(range(5))
print_ll(a) # 0 1 2 3 4
a = reverse_linkedlist1(a)
print_ll(a) # 4 3 2 1 0
a = reverse_linkedlist2(a)
print_ll(a) # 0 1 2 3 4
a = reverse_linkedlist3(a)
print_ll(a) # 4 3 2 1 0
a = reverse_linkedlist4(a)
print_ll(a) # 0 1 2 3 4

到此这篇关于用python介绍4种常用的单链表翻转的方法小结的文章就介绍到这了,更多相关python 单链表翻转内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Python 相关文章推荐
python的迭代器与生成器实例详解
Jul 16 Python
python基础教程之循环介绍
Aug 29 Python
Python常用的日期时间处理方法示例
Feb 08 Python
python结合opencv实现人脸检测与跟踪
Jun 08 Python
Python3 操作符重载方法示例
Nov 23 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
pyQT5 实现窗体之间传值的示例
Jun 20 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
python list数据等间隔抽取并新建list存储的例子
Nov 27 Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
Python字符串的转义字符
Apr 07 Python
关于多元线性回归分析——Python&SPSS
Feb 24 #Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 #Python
sklearn+python:线性回归案例
Feb 24 #Python
深入理解Tensorflow中的masking和padding
Feb 24 #Python
K最近邻算法(KNN)---sklearn+python实现方式
Feb 24 #Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 #Python
Python enumerate内置库用法解析
Feb 24 #Python
You might like
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
php微信开发接入
2016/08/27 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
js获取当前select 元素值的代码
2010/04/19 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
一个通过script自定义属性传递配置参数的方法
2014/09/15 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
web打印小结
2017/01/11 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
2017/01/20 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
2018/09/19 Javascript
vue-router 起步步骤详解
2019/03/26 Javascript
python 简易计算器程序,代码就几行
2009/08/29 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
python绘制中国大陆人口热力图
2018/11/07 Python
详解Python with/as使用说明
2018/12/13 Python
python反转列表的三种方式解析
2019/11/08 Python
python构建指数平滑预测模型示例
2019/11/21 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
用canvas显示验证码的实现
2020/04/10 HTML / CSS
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
高中生学习生活的自我评价
2013/10/09 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
北京故宫导游词
2015/01/31 职场文书
任命通知范文
2015/04/21 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
使用springMVC所需要的pom配置
2021/09/15 Java/Android
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸