一、链表和数组

在编写代码中,我们临时储存的数据是在内存当中,内存就像一块块并列排序的小方盒,每个小方盒都有自己地址,我们储存的数据就在这样一个个小方盒当中。

这些数据存放的结构有两种基本方式,数组和链表。

1,数组

数组在内存中是按顺序,内存地址来存储的,就好似上图的抽屉,从上到下,按顺序存放物品,中间不能间断,你在第一个抽屉放一个数据,又在第三个抽屉放一个数据,中间空一个抽屉,这是不允许的。这一特征也就意味着数据在内存中是相连的,紧紧不分开的,小的空闲内存空间可能会装不下较多的数据,造成了内存空间浪费。

世界上许多事情有好有坏,有利有弊,数组也是如此,数据在内存中紧密相连,也就意味着牵一发而动全身,比如你想在数组中添加一项数据,这就好比一排已经排好队的士兵,每个人都有自己的编号,而此时你突然要插入其中。

你:“兄弟方便让个位置吗?”

你后面的士兵都一脸凶神恶煞地看着你,如果不是排长强力要求你插入其中,他们肯定不会让你入队,因为你的入队,让你身后的士兵的编号都要往后挪,比如10号变成了11号。

数组也是一样,当新加入一个数据时,这就意味着它后面的数据内存地址都要往后稍一稍,删除亦如此。

2,链表 和赋值原理

链表与在内存中排列整齐的数组不同,它们像一堆散兵游勇,散布于内存中,只要哪里有空隙就往哪里钻,链表高效地运用了内存空间。虽然它们看起来杂乱无章,但其实它们井然有序,暗号让它们紧紧相连。数据与数据之间有一条“暗号”的链子相连接,哪个数据在首位,哪个数据在第二位……在末尾都非常清楚。

这种“暗号”其实就是内存地址,如下图,长方形就是节点,一个节点包含了两个方面的内容,数据和“暗号”,这个“暗号”其实就是下一个节点的引用信息。

链表的第一个和最后一个节点最重要和最特殊,最后一个节点则意味着后面没有数据了,所以它指向None,第一个节点的内存地址需要一个地方来保存,所以设立一个head属性对第一个节点应用。

下面来实现节点代码,一个节点有两个东西,数据和对下一个节点的引用:

class Node:

def __init__(self,x):

self.data = initdata #存放数据

self.next = None #对下一个节点的引用

def getData(self): #返回数据

return self.data

def getNext(self): #返回下一个节点

return self.next

def setData(self,newdata):

self.data = newdata

def setNext(self,newnext):

self.next = newnext

相信很多人都有疑问,为什么把下一个节点赋给上一个节点的next就实现了内存的引用呢?这与Python的特性有关,Python没有专门的指针,所有变量即是指针。

举一个例子,a = 6,一个简单的赋值,它在内存中是怎样实现的呢?

首先在内存中会创建数据6,数据6在内存中有自己的内存地址,然后再把变量标签a指向6,如上图a这个长方形中,实际是数据6的内存地址。再比如,a,b = b,a, 这实际就是a指向原来b指向的地址,b指向原来a指向的地址。明白了内存中赋值的原理,那么对Python链表中,next = 下一个节点,就会很清晰了,next指向下一个节点的内存地址。

三,单链表的实现

1,链表的优点和缺点

链表插入和删除数据非常快,但读取数据非常慢

数组

链表

读取

O(1)

O(N)

插入

O(N)

O(1)

删除

O(N)

O(1)

数组的读取非常快,因为它在内存中连续存储,插入和删除慢,是因为插入和删除都要改变相应的内存地址。

链表的插入和删除都很快,因为只要相应的改变节点中next的指向即可,链表访问一个特定数据时,必须沿着链表一个一个数据访问,所以读取很慢、

2,链表的方法

from node importNodeclassUnorderedList:def __init__(self):

self.head=Nonedefadd(self,item): #添加数据,这里是直接在首端添加

temp=Node(item)

temp.setNext(self.head)#next指向原来的表头,原来的第一个节点就变成第二个了,head为引用表头的信息

self.head = temp #在把head指向新增加的节点

defsize(self): #返回链表的size

current=self.head

count=0while current !=None:

count+=1current=current.getNext()returncountdefsearch(self,item): #数据是否在链表中

current=self.head

found=Falsewhile current != None and notfound:if current.getData() ==item:

found=Trueelse:

current=current.getNext()returnfounddefremove(self): #删除某个数据

current=self.head

previous=None

found=Falsewhile notfound:if current.getData ==item:

found=Trueelse:

previous=current

current=current.getNext()if previous ==None:

self.head=current.getNext()else:

previous.setNext(current.getNext())

python链表next_链表(python)相关推荐

  1. python代码找到链表的倒数第K个节点并打印

    python代码找到链表的倒数第K个节点并打印 在计算机科学中,链表是数据元素的线性集合,其顺序不是由它们在内存中的物理位置决定的.相反,每个元素指向下一个元素.它是一种数据结构,由一组节点组成,这些 ...

  2. python代码检测链表中的环并删除环

    python代码检测链表中的环并删除环 在计算机科学中,链表是数据元素的线性集合,其顺序不是由它们在内存中的物理位置决定的.相反,每个元素指向下一个元素.它是一种数据结构,由一组节点组成,这些节点共同 ...

  3. Python代码发现链表中的环并输出环中的第一个元素

    Python代码发现链表中的环并输出环中的第一个元素 # Python代码发现链表中的环并输出环中的第一个元素 # Find first node of loop in a linked list # ...

  4. python去实现链表_python实现链表

    链表: 链表不需要在内存存储一个连续的地方,通常就像一个链一样 它的每个节点包含本身和下一个元素的地址,以此来把两个元素进行关联,这就是一个链表 链表分单项和双向,一般单项就够用了. 链表存在的用意义 ...

  5. python 线程安全链表_教你用 Python 实现 HashMap 数据结构

    <犬夜叉·镜中的梦幻城> 今天这篇文章给大家讲讲hashmap,这个号称是所有Java工程师都会的数据结构.为什么说是所有Java工程师都会呢,因为很简单,他们不会这个找不到工作.几乎所有 ...

  6. Python数据结构之链表(linked list)

    Python数据结构之链表 一.链表的基本知识 最近在leetcode刷题时遇到了几道关于链表的题,于是恶补了一下关于链表的知识.什么是链表?熟悉python语法的同学肯定都知道list,但是这并不是 ...

  7. 用Python实现单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的⼀种形式,它的每个节点包含两个域,⼀个信息域(元素域)和⼀个链接域.这个链接指向链表中的下⼀个节点,⽽最后⼀个节点的链接域则指向⼀个空值. 表元素域ele ...

  8. python链表_使用python实现链表操作

    一.概念梳理 链表是计算机科学里面应用应用最广泛的数据结构之一.它是最简单的数据结构之一,同时也是比较高阶的数据结构(例如棧.环形缓冲和队列) 简单的说,一个列表就是单数据通过索引集合在一起.在C里面 ...

  9. python的线性链表_Python线性表——单链表-阿里云开发者社区

    Python线性表--单链表 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继, ...

  10. Python实现单向链表

    Python实现单向链表 关于链表的介绍,请参考:https://blog.csdn.net/weixin_43790276/article/details/104033254 本篇文章使用 Pyth ...

最新文章

  1. linux命令行怎么注释,Bash Shell 注释多行的几种方法
  2. mysql5.7+ 虚拟列,json使用初体验
  3. python画画零基础_[零基础学python]画圈还不简单吗?
  4. GridView多行表头合并
  5. java中文乱码解决之道(五)—–java是如何编码解码的
  6. 【联盛德W806上手笔记】三、MCU系统与时钟结构
  7. 台式电脑键盘按键错乱_电脑键盘按键怕误触怎么办?用这款软件帮你屏蔽指定键盘按键!支持替换按键!...
  8. poj 2181 jumping cows
  9. IBatis的resultMap使用
  10. React学习之进阶WEB组件(二十)
  11. 陶哲轩:一个华裔数学天才的传奇
  12. oracle 统计同比 环比,。oracle 同期 同比 环比
  13. 为海思u-boot快速生成reg_info.bin文件
  14. cxf调用报错Could not find conduit initiator for address:
  15. 分布式之数据库和缓存双写一致性方案解析
  16. 360图书馆破解代码
  17. 助力服装智造!这家企业携手美创实现全流程数据安全保障
  18. Kotlin协程 - - - 协程的简单使用
  19. 世界地图html效果,css3+html5世界地图区域划分高亮显示特效
  20. 安装nvidia显卡驱动报错You appear to be running an X server; please exit X before installing

热门文章

  1. [转]详细解说:简单CSS3实现炫酷读者墙
  2. 查看apt-get安装软件的版本
  3. 几种支持动作模型格式的比较(MD2,MD5,sea3d) 【转】
  4. hrbust 1041(并查集)
  5. jq遍历的基础语法之一
  6. UCIPC2012-Red/Blue Spanning Tree解题报告
  7. 【ICLR2021】伪标签还能这样用?半监督力作UPS大揭秘!
  8. 你是否有过疑问:为啥损失函数很多用的都是交叉熵(cross entropy)?
  9. 基于汉语短文本对话的立场检测系统理论与实践
  10. 机器学习—线性回归推广及案例