首先说下线性表,线性表是一种最基本,最简单的数据结构,通俗点讲就是一维的存储数据的结构。

  线性表分为顺序表和链接表:

  • 顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像;
  • 链式表示指的是用一组任意的存储单元存储线性表中的数据元素,称为线性表的链式存储结构。而他既可以是连续的也可以不连续,是通过一个与后继结点的连接信息构建起来的。

*顺序表(这个不是本次重点,简单介绍一下)

   顺序表是用一段连续的存储单元依次存储数据元素,查找元素是很方便的,但是如果要向其中添加删除元素就不那么简单了。因为添加删除元素要先找到那个位置,由于顺序表内部是通过地址的连续才使他成为一个表,当删掉元素时,要把后面的元素全部向前移,填补上空出来的地址空间;添加元素也是一样,需要先把该位置后面的元素向后移去,才能在这块地址上添加元素。

  以C语言为例:顺序表可以通过一个数组来表示,每创建一个数组就对应给他分配一块内存。当然除了静态分配空间,还可以动态扩展。后续的操作要在这块内存上进行,一般都需要移动数组元素,复杂度会很高。

  在python中,顺序表还有两种表示方式:

  • 一体式结构
  • 分离式结构

  这里的一体和分离是指表中的元素集合,和为实现正确操作而需记录的信息,这两部分是在同一块空间还是在旁边的一块新的空间中。

  python中的tuple和list就是采用了顺序表的实现技术,不过tuple是不可变的,不支持对内部的操作。而list是一个元素个数可变的线性表,支持添加删除等操作。list的思想其实是和C语言中一样的,只是对其中的功能进行了一些封装,也就是list的那些属性。

*链式表

  链表,顾名思义,相邻结点是通过链来连接的,那么什么是链呢。我们知道,C语言中有指针,指针通过地址来找到他的目标。如此说来,一个节点不仅仅有他的元素,还需要有一个他下一个元素的地址。

  那么,这里需要指针和地址。python中的指针是什么呢?下面先把这个放一下,先去理解一下python里面变量标识的实质。

  先看一下这个,为什么a和b的id是一样的呢?那我再问一个问题:python中交换两个变量的值时怎样来实现的?

1 a = 10
2 b = 20
3 a,b = b,a

  为什么python可以这样来赋值呢?下面我再画一幅图。

                   

  现在是否能理解了呢,变量本身就是存储的一个地址,交换他们的值就是把自己的指向更改一下。那么现在知道了标识的含义,我们的指针域该怎么写呢,是不是直接用变量等于下一个结点啊。这样看来就不复杂了,接下来的内容就和一般的链表一样了。我在这里说这些就是为了弄清楚python是怎么建立链接的。

一、单链表

  那么下面就通过一个类来实现一个节点,节点当中包括数据域和链接域,代码中实现了一些常用的功能,比如插入,查找等等。今天主要是说一下单链表是如何运用到python中的,由于我之前没有了解过这些。学习了之后,用自己之前的知识,就可以很方便的运用链表了。后面的代码就不过多解释了,自己仔细琢磨一下。有什么不理解的可以留言,我会尽量详细的回复。

  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 # @Date    : 2018-06-12 11:23:21
  4 # @Author  : yudanqu (943775910@qq.com)
  5 # @Link    : https://www.cnblogs.com/yudanqu/
  6 # @Version : $Id$
  7
  8
  9 class Node(object):
 10     """节点"""
 11
 12     def __init__(self, elem):
 13         self.elem = elem
 14         self.next = None  # 初始设置下一节点为空
 15
 16 '''
 17 上面定义了一个节点的类,当然也可以直接使用python的一些结构。比如通过元组(elem, None)
 18 '''
 19
 20
 21 # 下面创建单链表,并实现其应有的功能
 22
 23
 24 class SingleLinkList(object):
 25     """单链表"""
 26
 27     def __init__(self, node=None):  # 使用一个默认参数,在传入头结点时则接收,在没有传入时,就默认头结点为空
 28         self.__head = node
 29
 30     def is_empty(self):
 31         '''链表是否为空'''
 32         return self.__head == None
 33
 34     def length(self):
 35         '''链表长度'''
 36         # cur游标,用来移动遍历节点
 37         cur = self.__head
 38         # count记录数量
 39         count = 0
 40         while cur != None:
 41             count += 1
 42             cur = cur.next
 43         return count
 44
 45     def travel(self):
 46         '''遍历整个列表'''
 47         cur = self.__head
 48         while cur != None:
 49             print(cur.elem, end=' ')
 50             cur = cur.next
 51         print("\n")
 52
 53     def add(self, item):
 54         '''链表头部添加元素'''
 55         node = Node(item)
 56         node.next = self.__head
 57         self.__head = node
 58
 59     def append(self, item):
 60         '''链表尾部添加元素'''
 61         node = Node(item)
 62         # 由于特殊情况当链表为空时没有next,所以在前面要做个判断
 63         if self.is_empty():
 64             self.__head = node
 65         else:
 66             cur = self.__head
 67             while cur.next != None:
 68                 cur = cur.next
 69             cur.next = node
 70
 71     def insert(self, pos, item):
 72         '''指定位置添加元素'''
 73         if pos <= 0:
 74                 # 如果pos位置在0或者以前,那么都当做头插法来做
 75             self.add(item)
 76         elif pos > self.length() - 1:
 77             # 如果pos位置比原链表长,那么都当做尾插法来做
 78             self.append(item)
 79         else:
 80             per = self.__head
 81             count = 0
 82             while count < pos - 1:
 83                 count += 1
 84                 per = per.next
 85             # 当循环退出后,pre指向pos-1位置
 86             node = Node(item)
 87             node.next = per.next
 88             per.next = node
 89
 90     def remove(self, item):
 91         '''删除节点'''
 92         cur = self.__head
 93         pre = None
 94         while cur != None:
 95             if cur.elem == item:
 96                 # 先判断该节点是否是头结点
 97                 if cur == self.__head:
 98                     self.__head = cur.next
 99                 else:
100                     pre.next = cur.next
101                 break
102             else:
103                 pre = cur
104                 cur = cur.next
105
106     def search(self, item):
107         '''查找节点是否存在'''
108         cur = self.__head
109         while not cur:
110             if cur.elem == item:
111                 return True
112             else:
113                 cur = cur.next
114         return False
115
116
117 if __name__ == "__main__":
118
119         # node = Node(100)  # 先创建一个节点传进去
120
121     ll = SingleLinkList()
122     print(ll.is_empty())
123     print(ll.length())
124
125     ll.append(3)
126     ll.add(999)
127     ll.insert(-3, 110)
128     ll.insert(99, 111)
129     print(ll.is_empty())
130     print(ll.length())
131     ll.travel()
132     ll.remove(111)
133     ll.travel()

二、单向循环链表和双向链表

  与单链表相关联的,还有单向循环链表和双向链表:

  单向循环链表:在单链表的基础上,再多一个由尾节点指向首节点的链接,首节点是指链表的第一个存数据的结点,而头结点是指指向第一个存数据的结点的那个东西,仅有个链接域,而不是真正存储内容的链表结点。需要注意的是,循环链表中,一些功能的创建是和单链表不一样的,比如判空、判满,它是循环的该怎么判断呢?这些内容可以在上面给出的单链表的实现中进行修改获得,可以试一下。

  双向链表:与单链表相比,这个新增的特性就是双向。可以从前面向后面传递,也可以从后面向前面传递,这个前面和后面是我们自己定义的,认为从一端到另一端是正向,那么倒过来则相反。这个双向链表的实现和单链表也是基本上一样的。单向链表是除了数据域再添加一个链接域,来指向下一个结点。那么同样的道理,双向链表就再添加一个指向前一个结点的链接不就好了。这个时候再创建链表的时候就要把每个节点与前驱结点以及后继结点的链接建立好。

  双向链表的插入和删除等等操作,都要注意,不要把存储的地址信息丢了,仔细考虑好两边的指向,先把谁链接上去,再链接谁。

  今天本来只想说说前面那一点点内容的,写的写的,后面感觉不得不说一下,不过也没有写的比较完整。大家捡有用的东西来看。

转载于:https://www.cnblogs.com/yudanqu/p/9172459.html

单链表的python实现相关推荐

  1. python怎么反转单链表_单链表反转python实现代码示例

    单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: class Li ...

  2. bat面试题 python 单链表反转排序

    单链表反转python实现 单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表

  3. 单链表的增、删、查、改、python实现,超详细讲解

    单链表的python实现 代码增.删.查.改.及超详细注释: class Node(object):"""链表单节点实现"""def __i ...

  4. python之链表、单链表、双向链表、单向循环链表

    python之链表.单链表.双向链表.单向循环链表 链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时,又需要进行数据的搬迁,所以使用起来并非很灵活 链表结构可以充分利用计算机 ...

  5. Python 实现一个全面的单链表

    前言 实现清单 链表实现 总结 前言 算法和数据结构是一个亘古不变的话题,作为一个程序员,掌握常用的数据结构实现是非常非常的有必要的. 实现清单 实现链表,本质上和语言是无关的.但是灵活度却和实现它的 ...

  6. 实现单链表--Python

    单链表的结构 单链表结点的组成: 元素 链接域(保存下一结点的地址) 在单链表里,表里的n 个结点通过链接形成一条结点链.从表里的任一个结点都可以找到保存下一个元素的结点. 链表中的一个重要部分就是头 ...

  7. python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...

    本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和 ...

  8. python选出奇数并降序_奇数结点升序偶数结点降序的单链表排序(Python实现)

    题目 一个链表,奇数结点升序,偶数结点降序,要求变成一个全升序的链表. 例如:1->8->2->7->3->6->4->5,变为1->2->3-& ...

  9. 单链表反转的原理和python代码实现

    链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...

最新文章

  1. 高精度数取余(C\C++)
  2. Java虚拟机内存模型初步学习
  3. PTA 09-排序3 Insertion or Heap Sort (25分)
  4. 推荐 | 方便好用的浏览器插件
  5. java免检异常_java-异常
  6. Laravel核心技术解析(1)—— Composer 组件管理与自动加载
  7. PHP条件语句总结,php条件语句的总结
  8. shell中的正则表达式
  9. [Java] 蓝桥杯ADV-136 算法提高 大数加法
  10. CSDN如何上传文件
  11. APN(default、mms、supl、dun、hipri接入点类型的区别)
  12. python自动生成文章原创_【Python】皮皮AI工具( AI文章伪原创工具)
  13. 企业微信SCRM怎么弄永久群二维码?可以实现社群私域流量裂变吗?
  14. JAVA计算机毕业设计原创网络文学管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  15. 云更新服务器更新不了最新游戏,云更新游戏更新自动/手动更新游戏教程
  16. git本地库案例-找回删除的文件
  17. 自学编程的妙方法,直接省了几万块钱报班,不收藏就可惜了!
  18. R语言ggplot2可视化气泡图(bubble plot)、将可视化图像的图例(lengend)放置在图像底部、图例水平方向排布(horizontal direction)、图例标题在图例标签顶部
  19. 怎样获得元气骑士的损坏的机器人_元气骑士损坏的机器人怎么修复?机器人修复方法...
  20. ESP32C3 LED PWM 控制器

热门文章

  1. java注册登录客户端_GitHub - a-voyager/LoginSystem_Client: 登录注册系统(桌面客户端)——Java课程实践...
  2. 【java】Charset 字符集
  3. Java常用日志框架介绍
  4. python计算思维训练文件操作与异常处理_054 Python程序设计思维
  5. 中法线如何反转_凹凸贴图、法线贴图、置换贴图傻傻分不清?
  6. 美国研发出第一台计算机的时间,研发世界第一台电脑的核心人物,被美国隐藏35年,只因他是个华人...
  7. python手机号脱敏代码_Excel技巧—如何对手机号码脱敏处理
  8. 服务器自检后显示scsi,请问一下,如何检测SCSI +RAID 5设置是否正确??
  9. rust怎么拆自己石墙_房屋征拆:遭遇非法强拆怎么办?如何依法维护自己的权益...
  10. php随机数字不重复使等式成立_php随机数不重复生成的五种方式