用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中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
python查询sqlite数据表的方法
May 08 Python
基于ID3决策树算法的实现(Python版)
May 31 Python
深入理解Django中内置的用户认证
Oct 06 Python
Python简单计算数组元素平均值的方法示例
Dec 26 Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
Django中提供的6种缓存方式详解
Aug 05 Python
Python timeit模块的使用实践
Jan 13 Python
Python 利用flask搭建一个共享服务器的步骤
Dec 05 Python
python 获取域名到期时间的方法步骤
Feb 10 Python
Python3 使用pip安装git并获取Yahoo金融数据的操作
Apr 08 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
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
php报错502badgateway解决方法
2019/10/11 PHP
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
[00:23]DOTA2群星共贺开放测试 25日无码时代来袭
2013/09/23 DOTA
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
python正则表达式之作业计算器
2016/03/18 Python
python select.select模块通信全过程解析
2017/09/20 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
解决python 上传图片限制格式问题
2019/10/30 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
应聘面试自我评价
2014/01/24 职场文书
公司捐款倡议书
2014/05/14 职场文书
经典禁毒标语
2014/06/16 职场文书
授权委托书范文
2014/07/31 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
事业单位考察材料范文
2014/12/25 职场文书
五年级小学生评语
2014/12/26 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
python如何正确使用yield
2021/05/21 Python