用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中用Ctrl+C终止多线程程序的问题解决
Mar 30 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
python+opencv识别图片中的圆形
Mar 25 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
Jun 26 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
Aug 01 Python
Python解释器及PyCharm工具安装过程
Feb 26 Python
PyTorch中的C++扩展实现
Apr 02 Python
python将音频进行变速的操作方法
Apr 08 Python
基于Python的接口自动化读写excel文件的方法
Jan 15 Python
pytorch fine-tune 预训练的模型操作
Jun 03 Python
Python基础 括号()[]{}的详解
Nov 07 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
漂亮但不安全的CTB
2006/10/09 PHP
PHP学习笔记之二
2011/01/17 PHP
IE6,IE7下js动态加载图片不显示错误
2010/07/17 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
Python使用python-docx读写word文档
2019/08/26 Python
ubuntu上安装python的实例方法
2019/09/30 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
python如何进入交互模式
2020/07/06 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
HTML5实现预览本地图片
2016/02/17 HTML / CSS
彪马西班牙官网:PUMA西班牙
2019/06/18 全球购物
售后服务科岗位职责范文
2013/11/13 职场文书
高中英语教学反思
2014/02/04 职场文书
安全教育月活动总结
2014/05/05 职场文书
小学清明节活动总结
2014/07/04 职场文书
刑事上诉状范文
2015/05/22 职场文书
远程教育学习心得体会
2016/01/23 职场文书
以下牛机,你有几个
2022/04/05 无线电