python实现单向链表详解


Posted in Python onFebruary 08, 2018

本文研究的主要是Python中实现单向链表的相关内容,具体如下。

什么是链表

链表顾名思义就是~链

链表是一种动态数据结构,他的特点是用一组任意的存储单元存放数据元素。链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的。跟数组不同链表不用预先定义大小,而且硬件支持的话可以无限扩展。

链表与数组的不同点:

数组需要预先定义大小,无法适应数据动态地增减,数据小于定义的长度会浪费内存,数据超过预定义的长度无法插入。而链表是动态增删数据,可以随意增加。

数组适用于获取元素的操作,直接get索引即可,链表对于获取元素比较麻烦需要从头一直寻找,但是适用与增删,直接修改节点的指向即可,但是对于数组就比较麻烦了,例如[1,2,3,4]需要在下标为1的位置插入-2,则需要将[2,3,4]后移,赋值ls[1]=-2

数组从栈中分配空间, 对于程序员方便快速,但自由度小。链表从堆中分配空间, 自由度大但申请管理比较麻烦.

链表基本方法实现(Python)

1. 初始化链表

"""节点类"""


class Node(object):
  def __init__(self, data):
    self.data = data
    self.nex = None

def __init__(self):
  """初始化链表"""
  self.head = None

2. 获取链表长度

def __len__(self):
  pre = self.head
  length = 0
  while pre:
    length += 1
    pre = pre.nex
  return length

3. 追加节点

追加节点还是比较简单的,如果head节点不存在,则当前节点为head节点,否则的话找到尾节点,将尾节点的next指向当前节点(可以添加head和tail两个节点,就不用递归寻找尾节点了)

python实现单向链表详解

"""追加节点"""

def append(self, data):
  """
  1.head 为none :head-->node
  2.tail.nex-->node
  :param data:
  :return:
  """
  node = Node(data)
  if self.head is None:
    self.head = node
  else:
    pre = self.head
    while pre.nex:
      pre = pre.nex
    pre.nex = node

4. 获取节点

获取节点也是比较容易的,无非就是判断index值的正负

def get(self, index):
  """
  :param index:
  :return:
  """
  index = index if index >= 0 else len(self) + index
  if len(self) < index or index < 0:
    return None
  pre = self.head
  while index:
    pre = pre.nex
    index -= 1
  return pre

5. 设置节点

找到当前节点赋值即可

"""设置节点"""

def set(self, index, data):
  node = self.get(index)
  if node:
    node.data = data
  return node

6. 插入节点

插入节点需要找到插入节点的前一个节点pre_node(索引index的正负,前一节点不同,需要判断一下),然后将pre_node.nex指向当前节点。同时将当前节点的nex指向pre_node.nex.nex

python实现单向链表详解

"""插入节点"""

def insert(self, index, data):
  """
  1.index 插入节点位置包括正负数
  2.找到index-1-->pre_node的节点
  3.pre_node.next-->node
   node.next-->pre_node.next.next
  4.head
  :param index:
  :param data:
  :return:
  """
  node = Node(data)
  if abs(index + 1) > len(self):
    return False
  index = index if index >= 0 else len(self) + index + 1
  if index == 0:
    node.nex = self.head
    self.head = node
  else:
    pre = self.get(index - 1)
    if pre:
      nex = pre.nex
      pre.nex = node
      node.nex = nex
    else:
      return False
  return node

7. 删除节点

删除节点,也要区分一下索引的正负。找到当前节点的前一个节点pre_node和后一个节点next_node,将pre_node.nex?>next_node即可

python实现单向链表详解

"""删除某个元素"""

def delete(self, index):
  f = index if index > 0 else abs(index + 1)
  if len(self) <= f:
    return False
  pre = self.head
  index = index if index >= 0 else len(self) + index
  prep = None
  while index:
    prep = pre
    pre = pre.nex
    index -= 1
  if not prep:
    self.head = pre.nex
  else:
    prep.nex = pre.nex
  return pre.data

8. 反转链表

反转链表的实现有多种方式,比较简单的就是生成一个新的链表--》可以用数组存储所有节点让后倒序生成新的链表
在这里用下面这种方式生产:
反转链表就是将node.nex?>pre_node 递归实现即可,然后让tail赋值为head

python实现单向链表详解

"""反转链表"""

def __reversed__(self):
  """
  1.pre-->next 转变为 next-->pre
  2.pre 若是head 则把 pre.nex --> None
  3.tail-->self.head
  :return:
  """

  def reverse(pre_node, node):
    if pre_node is self.head:
      pre_node.nex = None
    if node:
      next_node = node.nex
      node.nex = pre_node
      return reverse(node, next_node)
    else:
      self.head = pre_node

  return reverse(self.head, self.head.nex)

9. 清空链表

将头赋为空就好

"""清空链表"""

def clear(self):
  self.head = None

总结

以上就是本文关于python实现单向链表详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
在Python的Django框架中为代码添加注释的方法
Jul 16 Python
Python实现单词翻译功能
Jun 06 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
python+ffmpeg视频并发直播压力测试
Mar 06 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
使用Python正则表达式操作文本数据的方法
May 14 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
python+tkinter实现学生管理系统
Aug 20 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
Dec 17 Python
Python生成器以及应用实例解析
Feb 08 #Python
代码分析Python地图坐标转换
Feb 08 #Python
python爬虫中get和post方法介绍以及cookie作用
Feb 08 #Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 #Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 #Python
Python列表推导式与生成器表达式用法示例
Feb 08 #Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 #Python
You might like
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
如何把PHP转成EXE文件
2006/10/09 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
python轻松实现代码编码格式转换
2015/03/26 Python
使用SAE部署Python运行环境的教程
2015/05/05 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
新手学python应该下哪个版本
2020/06/11 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
生产班组长岗位职责
2014/01/05 职场文书
顶撞领导检讨书
2014/01/29 职场文书
小学新教师培训方案
2014/02/03 职场文书
干部下基层实施方案
2014/03/14 职场文书
庆祝儿童节标语
2014/10/09 职场文书
培训讲师开场白
2015/06/01 职场文书
2015团员个人年度总结
2015/11/24 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript