用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 相关文章推荐
pyside写ui界面入门示例
Jan 22 Python
几种实用的pythonic语法实例代码
Feb 24 Python
Jupyter中直接显示Matplotlib的图形方法
May 24 Python
python3实现基于用户的协同过滤
May 31 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
Apr 30 Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 Python
Python日期格式和字符串格式相互转换的方法
Feb 18 Python
使用python计算三角形的斜边例子
Apr 15 Python
jupyternotebook 撤销删除的操作方式
Apr 17 Python
Keras 快速解决OOM超内存的问题
Jun 11 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
Python制作数据预测集成工具(值得收藏)
Aug 21 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
php 冒泡排序 交换排序法
2011/05/10 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
一段好玩的JavaScript代码
2006/12/01 Javascript
javascript html 静态页面传参数
2009/04/10 Javascript
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
微信小程序实现左侧滑动导航栏
2020/04/08 Javascript
小程序实现tab标签页
2020/11/16 Javascript
[02:02]2018DOTA2亚洲邀请赛Mineski赛前采访
2018/04/04 DOTA
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
Python中安装easy_install的方法
2018/11/18 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
2021/02/20 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
悦木之源美国官网:Origins美国
2016/08/01 全球购物
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
拾金不昧的表扬信
2014/01/16 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
项目中Nginx多级代理是如何获取客户端的真实IP地址
2022/05/30 Servers