用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 参数列表中的self 显式不等于冗余
Dec 01 Python
python冒泡排序简单实现方法
Jul 09 Python
基python实现多线程网页爬虫
Sep 06 Python
python通过elixir包操作mysql数据库实例代码
Jan 31 Python
pandas中去除指定字符的实例
May 18 Python
Python中if elif else及缩进的使用简述
May 31 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
python模拟实现斗地主发牌
Jan 07 Python
Python基于Socket实现简单聊天室
Feb 17 Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
May 25 Python
python 学习GCN图卷积神经网络
May 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
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
yii上传文件或图片实例
2014/04/01 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
javascript中万恶的function实例分析
2011/05/25 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
[59:42]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python实现的字典值比较功能示例
2018/01/08 Python
Selenium的使用详解
2018/10/19 Python
python安装本地whl的实例步骤
2019/10/12 Python
python selenium xpath定位操作
2020/09/01 Python
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
护士在校生自荐信
2014/02/01 职场文书
计算机专业自荐信范文
2014/05/28 职场文书
社区创先争优承诺书
2014/08/30 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
交通安全学习心得体会
2016/01/18 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang