热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据结构与算法(Python)第三天

数据结构与算法(Python)第三天3:链表为什么需要链表链表的定义3.1单向链表Python中赋值的实际意义:节点实现单链


数据结构与算法(Python)第三天

  • 3:链表
    • 为什么需要链表
    • 链表的定义
    • 3.1 单向链表
      • Python 中赋值的实际意义:
    • 节点实现
    • 单链表的操作
    • 单链表的实现
    • 测试
    • 链表与顺序表的对比




3:链表


为什么需要链表

顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。

链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。


链表的定义

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。

在这里插入图片描述


3.1 单向链表

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

在这里插入图片描述


  • 表元素域elem用来存放具体的数据。
  • 链接域next用来存放下一个节点的位置(python中的标识)
  • 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。

Python 中赋值的实际意义:

变量a,b是一块内存,里面存的是10,20的地址。
在这里插入图片描述
变量a是一块内存,可以任意赋值,(把a指向函数的地址)
在这里插入图片描述


节点实现

创建一个类,elem(item)=值,next=下一节点的地址。
在这里插入图片描述

#节点实现
class SingleNode(object):"""单链表的节点"""def __init__(self,item):#_item存放数据元素self.item=item#_next是下一节点的标识self.next=None

单链表的操作


  • is_empty() 链表是否为空
  • length() 链表长度
  • travel() 遍历整个链表
  • add(item) 链表头部添加元素
  • append(item) 链表尾部添加元素
  • insert(pos, item) 指定位置添加元素
  • remove(item) 删除节点
  • search(item) 查找节点是否存在

单链表的实现

链表的实现方式:
在这里插入图片描述

#单链表的操作class SingleLinkList(object):"""单链表"""def __init__(self,node&#61;None):self.__head&#61;nodedef is_empty(self):"""判断链表是否为空"""return self.__head &#61;&#61; Nonedef length(self):"""链表长度"""# cur初始时指向头节点cur&#61;self.__headcount&#61;0# 尾节点指向None&#xff0c;当未到达尾部时while cur !&#61;None:count &#43;&#61;1# 将cur后移一个节点cur&#61; cur.nextreturn countdef travel(self):"""遍历整个链表"""cur&#61;self.__headwhile cur !&#61; None:print(cur.item,end&#61;" "),cur&#61;cur.nextprint(end&#61;"\n")def add(self,item):"""链表头部添加元素,头插法"""node&#61;SingleNode(item)node.next&#61;self.__headself.__head&#61;nodedef append(self,item):"""链表尾部添加元素,尾插法"""node&#61;SingleNode(item)# 先判断链表是否为空&#xff0c;若是空链表&#xff0c;则将_head指向新节点if self.is_empty():self.__head&#61;node# 若不为空&#xff0c;则找到尾部&#xff0c;将尾节点的next指向新节点else:cur&#61;self.__headwhile cur.next !&#61;None:cur&#61;cur.nextcur.next&#61;nodedef insert(self,pos, item):"""指定位置添加元素:param pos 从0开始"""if pos<&#61;0:self.add(item)elif pos>self.length()-1:self.append(item)else:pre&#61; self.__headcount&#61;0while count < (pos-1):count &#43;&#61; 1pre&#61;pre.next#当循环退出后&#xff0c;pre指向pos-1的位置node&#61;SingleNode(item)node.next&#61;pre.nextpre.next&#61;nodedef remove(self,item):"""删除节点"""cur&#61;self.__headpre&#61;Nonewhile cur!&#61;None:if cur.item &#61;&#61; item:#先判断此节点是否为头节点#头节点if cur&#61;&#61;self.__head:self.__head&#61;cur.nextelse:pre.next&#61;cur.nextbreakelse:pre&#61;curcur&#61;cur.nextdef search(self,item):"""查找节点是否存在"""cur&#61;self.__headwhile cur !&#61;None:if cur.item &#61;&#61; item:return Trueelse:cur&#61;cur.nextreturn False

单链表的操作&#xff1a;
在这里插入图片描述


测试

if __name__&#61;&#61;"__main__":ll&#61;SingleLinkList()print(ll.is_empty())print(ll.length())ll.append(1)print(ll.is_empty())print(ll.length())ll.append(2)ll.add(8)ll.append(3)ll.append(4)ll.append(5)ll.append(6)ll.travel()ll.insert(-1,100) #100,8,1,2,3,4,5,6ll.travel()ll.insert(3,200) #100,8,1,200,2,3,4,5,6ll.travel()ll.insert(10,300) #100,8,1,200,2,3,4,5,6,300ll.travel()ll.remove(200)ll.travel()ll.remove(100)ll.travel()ll.remove(300)ll.travel()

运行结果&#xff1a;

True
0
False
1
8 1 2 3 4 5 6
100 8 1 2 3 4 5 6
100 8 1 200 2 3 4 5 6
100 8 1 200 2 3 4 5 6 300
100 8 1 2 3 4 5 6 300
8 1 2 3 4 5 6 300
8 1 2 3 4 5 6

链表与顺序表的对比

链表失去了顺序表随机读取的优点&#xff0c;同时链表由于增加了节点的指针域&#xff0c;空间开销比较大&#xff0c;但对存储空间的使用要相对灵活。

链表与顺序表的各种操作复杂度如下所示&#xff1a;
在这里插入图片描述

注意虽然表面看起来复杂度都是 O(n)&#xff0c;但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找&#xff0c;删除和插入操作本身的复杂度是O(1)。顺序表查找很快&#xff0c;主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况&#xff0c;顺序表进行插入和删除时需要对操作点之后的所有元素进行前后移位操作&#xff0c;只能通过拷贝和覆盖的方法进行。


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
author-avatar
赵春柱_626
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有