用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实现把json格式转换成文本或sql文件
Jul 10 Python
Django返回json数据用法示例
Sep 18 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
django ajax json的实例代码
May 29 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
深入理解Django-Signals信号量
Feb 19 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
Feb 21 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
python的faker库用法
Nov 28 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
Python map及filter函数使用方法解析
Aug 06 Python
实战Python爬虫爬取酷我音乐
Apr 11 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 数组遍历顺序理解
2009/09/09 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
基于php判断客户端类型
2016/10/14 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
ie下动态加态js文件的方法
2011/09/13 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
js取得html iframe中的元素和变量值
2014/06/30 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
VUE使用axios调用后台API接口的方法
2020/08/03 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
关于python pycharm中输出的内容不全的解决办法
2020/01/10 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
Python异常处理机制结构实例解析
2020/07/23 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
携程旅行网:中国领先的在线旅行服务公司
2017/02/17 全球购物
菲律宾购物网站:Lazada菲律宾
2018/04/05 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
销售团队口号大全
2014/06/06 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
补充协议书
2015/01/28 职场文书
刑事案件上诉状
2015/05/23 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
Python学习之os包使用教程详解
2022/03/21 Python