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下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 Python
运行django项目指定IP和端口的方法
May 14 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
Apr 06 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
Python使用字典实现的简单记事本功能示例
Aug 15 Python
Python3视频转字符动画的实例代码
Aug 29 Python
Python使用APScheduler实现定时任务过程解析
Sep 11 Python
Python pip install如何修改默认下载路径
Apr 29 Python
pycharm 对代码做静态检查操作
Jun 09 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
文章推荐系统(二)
2006/10/09 PHP
NOT NULL 和NULL
2007/01/15 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
PHP开发微信支付的代码分享
2014/05/25 PHP
smarty简单分页的实现方法
2014/10/27 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
PHP实现搜索相似图片
2015/09/22 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
jQuery实现上下滚动公告栏详细代码
2018/11/21 jQuery
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
新闻学毕业生自荐信
2013/11/15 职场文书
优秀实习自我鉴定
2013/12/04 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
不同意离婚代理词
2015/05/23 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫