用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实现SMTP发送邮件详细教程
Mar 02 Python
Python设计模式之抽象工厂模式
Aug 25 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
Django 前后台的数据传递的方法
Aug 08 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
Python实现DDos攻击实例详解
Feb 02 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 Python
Django命名URL和反向解析URL实现解析
Aug 09 Python
python中Lambda表达式详解
Nov 20 Python
python实现四人制扑克牌游戏
Apr 22 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
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
php生成shtml类用法实例
2014/12/09 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
2021/02/26 PHP
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
浅谈MySQL中的触发器
2015/05/05 Python
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python文件与文件夹常见基本操作总结
2016/09/19 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
python 爬虫如何正确的使用cookie
2020/10/27 Python
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
土木工程应届生自荐信
2013/09/24 职场文书
医科大学生毕业的自我评价分享
2013/11/12 职场文书
初中生学习生活的自我评价
2013/11/20 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
企业新年寄语
2014/04/04 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
物业保洁员管理制度
2015/08/05 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL
nginx中proxy_pass各种用法详解
2021/11/07 Servers
Java实现二分搜索树的示例代码
2022/03/17 Java/Android