用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获取Windows或Linux主机名称通用函数分享
Nov 22 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 Python
python读取文本中的坐标方法
Oct 14 Python
pycharm新建一个python工程步骤
Jul 16 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
20行代码教你用python给证件照换底色的方法示例
Feb 05 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 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中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
Vue基础配置讲解
2019/11/29 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
pyv8学习python和javascript变量进行交互
2013/12/04 Python
python虚拟环境迁移方法
2019/01/03 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
Python基于requests库爬取网站信息
2020/03/02 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
Laura官网:加拿大女性的顶级时尚目的地
2019/09/20 全球购物
群众路线教育实践活动方案
2014/02/02 职场文书
民事二审代理词
2015/05/25 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
基于Python实现射击小游戏的制作
2022/04/06 Python
css样式important规则的正确使用方式
2022/06/10 HTML / CSS