一、前言

链式存储作为一种重要的数据存储方式有着极强的数据组织能力、灵活型和动态性,在众多数据结构中应用非常广泛。所谓链式存储结构,就是采用分散的存储空间分别存储每一组数据再通过地址链接的形式将全部数据组织到一起,这在C/C++语言中非常容易实现,因为他们有一个非常强大的工具——指针。指针虽然强大但也常常是劝退C语言入门者的一大杀器,作为最易入门的语言,python在程序员层面放弃了类似于指针的相关操作和地址的相关概念,没有了指针,我们该如何实现链式存储结构呢?

我个人认为,python作为一款不需要编程者显示地定义数据类型的编程语言,我们可以利用其面向对象的特性及其数据类型的灵活性和多样性,更加简单的实现链式存储结构。在这里,我以最基础的链式存储结构——单链表简单做一下介绍。

二、简单可行性分析

我们类比C语言中实现链式结构的方式来尝试在python中能否实现。

在C语言中,我们使用结构体来定义链表中的节点类型,每一个节点中包含一个数据域用来存储数据和一个地址域用来链接下一个节点。

typedef 

而在python中,“类”可以实现类似于C语言结构体的功能,因此我们定义一个节点类。同样的,类中包含两个属性,一个是用来存储数据的数据域和一个用来存储下一个节点的节点域。

class 

接下来我们手动链接几个节点来试一试这种类定义的可行性。

# 这里初始化三个LinkListNode类对象,其中head_node为头节点
head_node = LinkListNode()
node1 = LinkListNode()
node2 = LinkListNode()# 这里我们依次将三个节点对象链接在一起
head_node.next = node1
node1.next = node2# 为了验证链接是否成功,我们将node2的数据域改为10,并通过头节点来访问它
node2.data = 10
data = head_node.next.next.data
print(data)

可以看到,我们成功的通过头节点访问到了第三个节点并打印了其数据域的值。也就是说,我们通过上述定义类方式,实现了节点的链接,也就是在python中实现链式存储结构是完全可行的。

三、链表的几个常用操作的实现

因为没有单独定义头节点的类,所以头节点对象同样拥有数据域,我利用该数据域来存储链表的长度,并在某些功能里加以利用。

  1. 判断链表是否为空
 def if_empty(head):if head.next is None:return Trueelse:return False

由于头节点的数据域存储链表的长度,所以下面这种方法也是完全可行的

def if_empty(head):if head.data == 0:return Trueelse:return False

2.遍历链表

def traversal(head):if head.next is None:print("Error! LinkList is empty!")else:node = head.nextwhile node is not None:print(node.data, end=' ')node = node.next

3.在任意位置添加一个数据域值为data的节点

def add_node(head, data, location=-1):# 检查添加的位置是否合法,其中-1代表表尾if location > head.data + 1 or (location <= 0 and location != -1):print("Input position exception, add failed!")else:node = LinkListNode()pre_node = headnode.data = dataorder = 1if 1 <= location <= head.data:# 如果添加的节点位置不在表尾,需要改动两个节点的next值while order != location:pre_node = pre_node.nextorder += 1node.next = pre_node.nextpre_node.next = nodeelse:# 如果添加的节点位于表尾,只需要改变尾节点的next值pre_node = headwhile pre_node.next is not None:pre_node = pre_node.nextpre_node.next = nodehead.data += 1

4.删除任意位置的节点

def pop_node(head, location=-1):# 检删除的位置是否合法,-1代表表尾if location > head.data or (location <= 0 and location != -1):print("Input position exception, pop failed!")else:pre_node = headorder = 1if 1 <= location < head.data:# 如果删除的节点位置不在表尾,需要改动两个节点的next值while order != location:pre_node = pre_node.nextorder += 1data = pre_node.next.datapre_node.next = pre_node.next.nextelse:# 如果删除的节点位于表尾,只需要改变尾节点的next值# 这里要注意,如果直接将表尾节点置为None,python会理解为新建一个值为Node的变量# 所以只能找到前驱节点,然后将前驱节点的next置为Nodepre_node = headwhile pre_node.next.next is not None:pre_node = pre_node.nextdata = pre_node.next.datapre_node.next = Nonehead.data -= 1return data

其他的功能,例如访问某个节点的数据域,都可以用相关代码实现,这里就不在赘述。

四、总结

这里只展示了单链表的相关操作,但是如上文定义节点类时注释中所说,通过更改类中属性的定义,完全可以实现双链表、循环链表、二叉链表等所有常用的链式存储结构。另外也可以更改本文中展示的单链表中增加节点和删除节点等操作来实现栈和队列。

个人理解,如有错误,请及时指出!谢谢!

链表list(链式存储结构实现)_VOL.2 如何在python中实现链式存储结构相关推荐

  1. python语言结构化语言_如何在python中处理结构化语言文件

    我有一个像这样的大型结构化语言文件:TASK SchM_Task { TYPE = AUTO; SCHEDULE = NON; PRIORITY = 160; ACTIVATION = 1; TIMI ...

  2. 在python中使用json格式存储数据

    在python中使用json格式存储数据 代码如下: import jsonlist1 = [{'A': [1, 2, 3, 4, 5, 6], 'B': [3, 4, 5, 6, 7]},{'C': ...

  3. python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是

    在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...

  4. Python中的推导式

    推导式 Compression 推导式 ( Compression )是Python语言的一大特色 相比于其他语言而言, 推导式使得Python能够编辑的进行循环,创建出特定的字典,列表等可迭代对象 ...

  5. 如何在PHP中实现链式方法调用

    写程序的人都喜欢偷懒,希望少打几行代码,并且让代码看起来很酷. 所以很多人写程序都会选择三元运算取代if..else.... 而用过JS的人应该都见识过js中的链式方法. 如 somevars.fun ...

  6. python变量存为matlab,详解如何在python中读写和存储matlab的数据文件(*.mat)

    背景 在做deeplearning过程中,使用caffe的框架,一般使用matlab来处理图片(matlab处理图片相对简单,高效),用python来生成需要的lmdb文件以及做test产生结果.所以 ...

  7. python中ifelifelse用在什么结构_详解Python if-elif-else知识点

    有的时候,一个 if - else - 还不够用.比如,根据年龄的划分:条件1:18岁或以上:adult 条件2:6岁或以上:teenager 条件3:6岁以下:kid Python if-elif- ...

  8. python使用循环结构计算10_十二、 python中的循环结构

    我们要计算1+2+3的时候,可以直接写出来,但是计算1+2+3+···+100的时候,就不能写了.如果计算1到1亿的和,全写出来就有点不现实了.为了让计算机能计算出1到1亿的和,这时候就需要循环结构了 ...

  9. 理解Python中整型对象存储的位置

    在 Python 整型对象所存储的位置是不同的, 有一些是预先分配内存的,它一直存储在内存里面, 而其它的, 则在使用时开辟出空间. 说这句话的理由, 可以看看如下代码: a = 5 b = 5 a ...

最新文章

  1. #1074 : 字体设计
  2. k8s集群部署之环境介绍与etcd数据库集群部署
  3. 分区表需要数据备份吗oracle,Oracle 分区表数据的导入与导出(1)
  4. Java 技术小图谱
  5. Sonatype Nexus高级配置
  6. Exp-00009错误解決
  7. 小米更新显示非官方rom_魔趣ROM 安装刷入教程(小白新手)
  8. 星光灿烂 拍夜景的技巧和设置
  9. php 内链接实现三表,Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
  10. python入门基础知识实例-Python入门,原来如此简单!
  11. [转载] numpy总结
  12. QT 的信号与槽机制介绍(转载)
  13. C# Linq处理list数据
  14. Nachos操作系统实习-lab1
  15. 企业微信和个人微信优劣势是什么?如何实现站外引流到微信?
  16. linux 命令行字体发虚,解决Linux字体发虚的终极方法
  17. 安卓开发——做一个能定时唤起其他APP的闹钟程序
  18. [Paper Reading] Preference-Adaptive Meta-Learning for Cold-Start Recommendation
  19. React基础(2)—— React函数式组件使用ref
  20. 基于stm32的两轮自平衡小车1(模块选型篇)

热门文章

  1. Play 1.x框架学习之五:错误信息显示 (error message display In play framework)
  2. c++函数内部可以返回函数内部定义的指针 但是不能返回函数内部定义的数组...
  3. hdu Remainder
  4. jQuery实现用户注册的表单验证
  5. display:inline-block+text-align:justify实现列表元素的两端对齐
  6. java中==和equals的区别
  7. markdown语法进阶
  8. 关于MAC升级后,vim更新插件报错
  9. PAT 1025 反转链表 (25)(STL-map+思路+测试点分析)
  10. 在qemu模拟的aarch32上使用kgtp