一、什么是链表

链表是由多个不同的节点组成,每个节点通过指针区域关联到一起
链表的头指针,指向了头节点,通过头指针可以找到其他节点信息

二、什么是节点

链表由节点组成,每个节点又包含两个部分,一个是元素区域,一个是指针区域。
元素区域存储的是,当前节点的数值,指针区域指向下一个节点的对象。在C语言中,指针应该是指向下一个元素的的内存地址,因python中不研究指针,这里用下一个节点的对象代替。这样我们就能通过指针区域,找到下一个节点的信息,从而得到下一个节点的值了。

三、为什么引入链表的概念

1.先说说数组这种数据结构吧,数组是一块大的连续内存空间。每次初始化需要开辟一大块内存空间,空间利用率比较低。而链表则不同,链表的节点可以随机分布在任何位置,只需通过指针穿引起来即可。
2.在连续的内存空间中,插入一个元素时,所有其他元素的位置也变动了。插入元素、删除元素时候,效率比较低。
链表是非连续的内存空间,每个节点单独存在自己的内存空间,通过指针指向下一个节点。
如果在某个地方插入一个节点,只需要改变指针的指向即可,不用其他元素都变动。

四、链表的基本操作

# 实现头部插入 尾部插入 根据索引插入 删除节点并print 打印
# 定义一个节点
class Node:def __init__(self, data):self.data = dataself.next = Noneclass SingleLinkList:def __init__(self):self.head = Noneself.tail = Nonedef is_empty(self):"""链表是否为空:return:"""return self.head is Nonedef length(self):"""求当前链表的长度:return:"""count = 0cur = self.headwhile cur is not None:count += 1cur = cur.nextreturn countdef insert_head_node(self, data):"""链表头部添加元素:param data: 要保存的数据:return:"""node = Node(data)node.next = self.headself.head = nodedef append_node(self, data):"""链表尾部添加元素,有多种实现方式:param data::return:"""# 第一种方式  时间复杂度为O(n)的处理方式node = Node(data)# 如果链表为空,需要特殊处理if self.is_empty():self.head = nodeelse:cur = self.headwhile cur.next is not None:cur = cur.next# 退出循环时, cur指向尾节点cur.next = node# 第二种 引入一个tail指针 默认当前链表为一个空链表,不停的去append节点# node = Node(data)# if self.is_empty():       # 当第一次添加节点到空链表中的时候,头指针和尾指针同时指向新节点#     self.head = node#     self.tail = node# else:# 当再次添加节点到链表中的时候, 头指针始终指向头节点,尾指针始终执行未节点,如果一直向未节点追加节点,只需移动tail指针即可#     self.tail.next = node#     self.tail = nodedef insert_node(self, pos, data):"""指定位置添加元素:param pos::param data::return:"""# 1, 在头部添加if pos <= 0:self.insert_head_node(data)# 2, 在尾部添加elif self.length() >= pos:self.append_node(data)# 3, 指定位置添加else:count = 0while count < (pos - 2):count += 1self.head = self.head.next# 这时候self.head 表示当前插入前一个节点# self.head.next 表示当前插入的后一个节点node = Node(data)self.head.next = nodenode.next = self.head.nextdef delete_node(self, data):"""删除节点:param data::return:"""cur = self.head     # 记录当前节点的位置pre = None          # 记录当前节点位置的前置节点while cur is not None:# 找到了要删除的元素if cur.data == data:# 在头部找到了要删除的元素if cur == self.head:self.head = cur.nextreturn Trueelse:pre.next = cur.nextreturn Trueelse:# 不是要找的元素, 移动光标pre = curcur = cur.nextdef search_node(self, data):"""查找节点是否存在:return:"""cur = self.headwhile cur is not None:if cur.data == data:return Truecur = cur.nextreturn Falsedef reveres_node(self):"""链表反转:return:"""if self.is_empty():returnj = 0while j < self.length() - 1:cur = self.headfor i in range(self.length() - 1):cur = cur.nextif cur.next is None:x = cur.dataself.delete_node(cur.data)self.insert_node(j, x)j += 1return self.head

python 链表的基础概念和基础用法相关推荐

  1. Python基础概念_2_基础概念

    基础概念 3 基础概念 3.1 数字 计算机最初设计时就是为了做数据运算的,所以针对这个概念应该不会陌生.在Python的世界里数主要有三种类型: 整数.浮点数和复数,详见下例: a) 5 是一个整数 ...

  2. Elasticsearch7.15.2 基础概念和基础语法

    文章目录 一.基础概念 1. ES是什么? 2. 名词定义 3. 对应关系 4. 索引 5. 分词 二.基础概念 2.1. 索引创建 2.2. 索引/文档删除 2.3. 索引修改 三.ES 查询 3. ...

  3. python函数和方法概念_python基础学习——函数和方法的区别与联系

    以下是综合多家说法的个人理解总结,仅为做到理解它们的区别与联系,不保证严谨. 函数 函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用. 独立的函数是函数(像 ...

  4. Vue基础概念,基础指令,选项式API

  5. k8s pod基础概念

    k8s pod基础概念 Pod基础概念: Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象.一个Pod代表着集群中运行的一个进程.kubernetes中其他大 ...

  6. 一起学AI:核心基础概念

    一起学AI:核心基础概念 AI基础概念 什么是学习率? batchsize和epoch分别是什么? 梯度消失与梯度爆炸是什么? 什么是过拟合.欠拟合和泛化? 归一化.正则化.标准化是什么? 线性回归和 ...

  7. python类装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  8. python装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  9. python列表生成式内必须定义匿名函数_Python基础-----基础概念总结

    Python基础-----基础概念总结 Python程序的构成 构成图 行连接符:\ 对象基本构成和内存示意图 对象及其引用(变量) 标识符 基本用法 命名规则 变量和简单的赋值语句 变量声明必须初始 ...

最新文章

  1. win10进不了微软服务器,Microsoft帐户无法登录怎么办 Win10微软账户登录不上解决方法...
  2. ios与html数据交互,iOS iOS与html进行交互
  3. 【Linux】一步一步学Linux——type命令(200)
  4. kotlin学习笔记——Kotlin Android Extensions
  5. linux中的码字软件,码字写作软件下载
  6. 键盘上在方向键上面的9个键是干什么的?
  7. 用户控件与自定义控件
  8. 【Intellij-IDEA系列】IDEA右键没有Git或svn处理方法
  9. Zephyr下使用TFLite进行语音识别
  10. 四个数学软件主要特点
  11. 2022年6月编程语言排行,第一名居然是它?!
  12. 爬虫英雄联盟官网的全英雄介绍和技能介绍
  13. 二次元壁纸 | 心情烦躁?换上喜欢的手机壁纸
  14. 【帝国CMS】灵动标签调用标题图片没有图片时显示默认图片
  15. 近期DDG挖矿病毒防护与分析
  16. 先有鸡还是先有蛋的争论
  17. 蓝桥杯单片机——LED指示灯(1)
  18. 基于Android的MJPEG网络摄像机设计
  19. uniapp结合萤石视频ezuikit.js的爬坑记录
  20. 开发润乾报表过程:因为内容过多分页导致的这条线

热门文章

  1. toch_geometric 笔记:message passing GCNConv
  2. 文巾解题 46. 全排列
  3. MATLAB从入门到精通-Matlab R2020b新功能 | 子标题和标题/标签对齐功能!
  4. 机器学习算法源码全解析(四)-人工神经网络关键核心知识点汇总
  5. python 拓扑排序 dfs bfs_拓扑排序的DFS和BFS
  6. html转图片_jupyter lab 笔记添加图片的方法汇总
  7. matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
  8. python中的路径问题汇总
  9. 一图理解JavaWeb项目
  10. numpy.argsort详解