用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 break语句详解
Mar 11 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
Python基于select实现的socket服务器
Apr 13 Python
使用Python写一个小游戏
Apr 02 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
Python中矩阵创建和矩阵运算方法
Aug 04 Python
几行Python代码爬取3000+上市公司的信息
Jan 24 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
pyecharts调整图例与各板块的位置间距实例
May 16 Python
python集合能干吗
Jul 19 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 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
Get或Post提交值的非法数据处理
2006/10/09 PHP
用定制的PHP应用程序来获取Web服务器的状态信息
2006/10/09 PHP
定义php常量的详解
2013/06/09 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
JavaScript入门之基本函数详解
2011/10/21 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
js在IE与firefox的差异集锦
2014/11/11 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
2016/01/14 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
vue返回上一页面时回到原先滚动的位置的方法
2018/12/20 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
js实现简单扫雷
2020/11/27 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python数据类型详解(二)列表
2016/05/08 Python
python基础教程之匿名函数lambda
2017/01/17 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
Python流程控制 while循环实现解析
2019/09/02 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
企业理念标语
2014/06/09 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
Python学习之异常中的finally使用详解
2022/03/16 Python