用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 相关文章推荐
linux下python抓屏实现方法
May 22 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 Python
python中set常用操作汇总
Jun 30 Python
python下实现二叉堆以及堆排序的示例
Sep 29 Python
python利用rsa库做公钥解密的方法教程
Dec 10 Python
Python3 中文文件读写方法
Jan 23 Python
python如何生成网页验证码
Jul 28 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
在python中利用try..except来代替if..else的用法
Dec 19 Python
python使用pyecharts库画地图数据可视化的实现
Mar 25 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
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
php验证码生成器
2017/05/24 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
IE8 浏览器Cookie的处理
2009/01/31 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
python中文编码问题小结
2014/09/28 Python
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
python处理大日志文件
2019/07/23 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
通信工程毕业生自荐信
2013/11/01 职场文书
前台文员的岗位职责
2013/11/14 职场文书
寒假实习自荐信
2014/01/26 职场文书
C++程序员求职信范文
2014/04/14 职场文书
村庄环境整治方案
2014/05/15 职场文书
中国梦团日活动总结
2014/07/07 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
2014年法院个人工作总结
2014/12/17 职场文书
2016预备党员培训心得体会
2016/01/08 职场文书
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js