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程序与C++程序的联合使用
Apr 07 Python
Python import用法以及与from...import的区别
May 28 Python
Python 通过URL打开图片实例详解
Jun 01 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
Python模块的加载讲解
Jan 15 Python
python主线程与子线程的结束顺序实例解析
Dec 17 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
python如何爬取网页中的文字
Jul 28 Python
Python自动化xpath实现自动抢票抢货
Sep 19 Python
详解用Python把PDF转为Word方法总结
Apr 27 Python
python内置模块之上下文管理contextlib
Jun 14 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
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
checkbox 复选框不能为空
2009/07/11 Javascript
提高javascript效率 一次判断,而不要次次判断
2012/03/30 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
javascript每日必学之封装
2016/02/23 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
2018/04/17 Javascript
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
柏林通行证:Berlin Pass
2018/04/11 全球购物
大学毕业生工作的自我评价
2013/10/01 职场文书
环保标语口号
2014/06/13 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
校园广播稿100字
2014/10/06 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
百年孤独读书笔记
2015/06/29 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python