数据结构--单向链表篇(python实现)

news2024/9/30 15:27:09

写在开头

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)

链表的优缺点

优点

  • 不需要预先知道数据大小,实现灵活的内存动态管理

  • 插入、删除指定数据速度快

缺点

  • 读取指定位置数据速度慢

  • 空间开销比较大

链表的分类

单向链表

链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域。这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值

双向链表

一种更复杂的链表是“双向链表”或“双面链表”

每个节点有两个连接:一个指向前一个节点,(当此“连接”为第一个“连接”时,指向空值或者空列表);而另一个指向下一个节点,(当此“连接”为最后一个“连接”时,指向空值或者空列表)

循环链表

在一个 循环链表中, 首节点和末节点被连接在一起。这种方式在单向和双向链表中皆可实现

要转换一个循环链表,可以开始于任意一个节点然后沿着列表的任一方向直到返回开始的节点

循环链表中第一个节点之前就是最后一个节点,反之亦然

数组 VS 链表

单向链表

单链表的基本操作

节点的创建
初始化单向链表
插入节点
头节点
中间节点
尾节点
删除节点
访问节点
查找节点

初始化单链表

需要初始化node类(需要一个节点)

class ListNode:
  def __init__(self, val: int):
    self.val: int = val        # 节点值
    self.next: ListNode | None = None # 指向下一节点的引用

创建链表

class MyLinkedList:
  def __init__(self):
    self.size = 0
    self.head = ListNode(0)

插入节点

插入数据

这个方法写完了可以直接在添加头节点和添加尾节点的地方直接进行调用

插入节点的方法本质上都是往哪一个地方插入,无论是头节点或者尾节点,因此我们可以将插入的方法写出一个通用的方法

 def add_at_index(self, index:int, val:int):
    '''
     将val的值增加到指定index索引的位置
     :index 索引  0<=index<=size
     '''
    # 判断索引是否有效
    if index > self.size:
      return
    index = max(0, index) 
    # 创建新节点
    add_node = LinkNode(val)
    # 获取头节点
    pred = self.head
    # 根据index找到前驱节点
    for _ in range(index):
      pred = pred.next
    # 将新节点的下一个节点 指向 前驱节点的 下一个节点
    add_node.next = pred.next
    # 将前驱节点的下一个节点 指向 新节点
    pred.next = add_node
    # 链表长度+1
    self.size += 1

插入头节点

def add_at_head(self, val: int) -> None:
  self.add_at_index(0, val)

插入尾节点

def add_at_tail(self, val: int) -> None:
  self.add_at_index(self. Size, val)

获取数据

获取单链表中第index个节点

def get(self,index:int) -> int:
    '''
     获取index索引位置的值
     '''
    # 判断索引是否有效
    if index < 0 or index >= self.size:
      return -1
    #  获取头节点
    pred = self.head
    # 遍历链表,index次
    for _ in range(index+1):
      pred = pred.next
    # 返回index索引位置的值
    return pred.val

删除数据

如果索引index有效,则删除链表中的第index个节点

def delete_at_index(self,index:int) -> None:
    '''
     删除index索引位置的值
     '''
    # 判断索引是否有效
    if index < 0 or index >= self.size:
      return
    # 获取头节点
    pred = self.head
    # r遍历链表,index次,找到前驱节点
    for _ in range(index):
      pred = pred.next
    pred.next = pred.next.next
    # 链表长度-1
    self.size -= 1

遍历链表

def traverse(self):
  cur = self.head.next # 从头节点的下一个节点开始遍历
  while cur: # 当当前节点不为空时
    # 对当前节点执行特定操作,例如打印节点的值
    print(cur.val)
    cur = cur.next # 移动到下一个节点

写在最后

单向链表不难,可以这样理解,链表中的每一个元素称之为节点,每个节点都包含两部分,用来存放具体信息的和用来存放指向下一个节点位置的(你可以想象为单线联系,你不知道你的上线是谁,但你知道你的下线在哪,每次想要找到你们这个组织中的某个谁,都必须从这个组织的开头进行查找,所以是On的复杂度),添加节点就是组织上又加入了一个人,你可以选择把它放在组织中的任何位置,前提是得在组织中,你得让他的上级知道它有了下级,并且给它指定一个下级(如果有的话),删除节点就是这个人在这个组织中没有上线和下线了(将指向该节点的指针指向别处),没人搭理你了,你就被删除了。

理解完简单的概念之后,在画个图加深一下印象,相信单向链表对你而言也是非常轻松的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1913299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简易限流实现

需求描述 写一个1秒两个的限流工具类&#xff0c;2r/s 使用semaphore 代码实现-类似令牌桶算法 public class LimitHelper {private int maxLimit;private Semaphore semaphore;private int timeoutSeconds;public LimitHelper(int maxLimit, int timeoutSeconds) {this.max…

向github远程仓库中push,要求使用token登录

Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. 如上&#xff0c;当向github远程仓库push时&#xff0c;输入github的用户名和密码出现如上错误&#xff0c;要求使用token登录&#xff0c;此时只需要用户…

【uni-app+Vue3】 API请求封装:让接口调用更便捷

前言&#xff1a;uni-app是一款基于Vue.js框架的跨平台开发工具&#xff0c;可以将代码编译成H5、小程序、App等不同平台的应用。在进行uni-app开发时&#xff0c;网络请求是必不可少的环节。为了方便开发&#xff0c;我们可以封装一些网络请求方法&#xff0c;以便在多个页面中…

数据结构(初阶1.复杂度)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度&#xff1f; 2.2.2.// 计算Func3的时间复杂度&#xff1f; 2.2.3.// 计算Func4的时间复杂度&#xff1f; 2.2.4.// 计算strchr的时间复杂度&#xff1f; …

RSRS研报复现——年化21.5%,含RSRS标准分,右偏标准分的Backtrader指标计算(代码+数据)

原创文章第583篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 继续Backtrader&#xff0c;今天讲讲指标扩展。 作为规则型的量化框架&#xff0c;指标是非常重要的元素&#xff0c;它是策略的基础。 我们来扩展一个经典的指标&#xff0c;RSR…

docker 安装教程

机缘 最近在开发用用到了docker,主要是将开发的项目发版到平台上&#xff0c;运用到docker发版&#xff0c;所以才会写这篇文章。 教程 1、安装Hype-v。 在安装之前&#xff0c;首先要检查下电脑系统是否安装Hyper-v功能。 注意&#xff1a;一定要检查电脑系统&#xff0c;…

在繁华与奇迹交织的深圳

在繁华与奇迹交织的深圳&#xff0c;有一本奇书悄然走红&#xff0c;它便是《华强北经济学》&#xff0c;由那位深谙市场脉搏、笔触带风的宋仕强先生所著。这本书&#xff0c;仿佛是华强北这片创业热土的缩影&#xff0c;用一个个生动鲜活的故事&#xff0c;诠释了什么是“从螺…

Go语言---正则表达式

正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低&#xff0c;但是它却更灵活。按照它的语法规则&#xff0c;只需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合。go语言的通过regexp标准包来实现…

【C++报错已解决】Invalid Conversion from ‘const char*’ to ‘char*’

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言 ❓ 一、问题描述 &#x1f469;‍&#x1f52c;1.1 报错示例 &#x1f3c6;1.2 报错分析 &#x1f4da;1.3 解决…

【python】PyQt5事件传递,鼠标动作捕获,键盘按键捕获原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Java面试八股之MySQL中的锁及其作用

MySQL中的锁及其作用 MySQL中的锁分类 全局锁&#xff08;Global Lock&#xff09;&#xff1a; 描述&#xff1a;对整个数据库实例加锁&#xff0c;最常见的是FLUSH TABLES WITH READ LOCK命令&#xff0c;主要用于全库备份等场景&#xff0c;阻止所有对表的写入操作。 作…

上海亚商投顾:沪指大涨超1% 两市成交额重回7000亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日放量反弹&#xff0c;午后集体涨超1%&#xff0c;深成指一度涨逾2%。消费电子板块全线爆发。 板…

基于视觉的具身导航

基于视觉的具身导航 背景 什么是&#xff08;视觉的&#xff1f;&#xff09;具身导航 输入机器人观测的当前图像 o t o_t ot​和目标图像 o G o_G oG​&#xff0c;输出当前时间步的控制动作 u t u_t ut​&#xff0c;最终到达指定地点的算法流程。 通用的评价指标 性能指…

教师管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;教师管理&#xff0c;个人认证管理&#xff0c;课程信息管理&#xff0c;课堂记录管理&#xff0c;课堂统计管理&#xff0c;留言板管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;课程信息…

【C++报错已解决】Invalid Use of ‘void’ Expression

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;调整函数返回类型方法二…

如何在 C 语言中实现链表?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

【安全设备】Web应用防火墙

一、什么是Web应用防火墙 Web应用程序防火墙&#xff08;Web Application Firewall&#xff09;的缩写是WAF&#xff0c;用于保护Web应用程序免受各种恶意攻击和漏洞利用。WAF通过监控和过滤进出Web应用程序的HTTP/HTTPS流量来工作。它位于Web应用程序和用户之间&#xff0c;分…

【android 9】【input】【10.发送按键事件4——View的分发流程】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录…

LabVIEW平台从离散光子到连续光子的光子计数技术

光子计数技术用于将输入光子数转换为离散脉冲。常见的光子计数器假设光子是离散到达的&#xff0c;记录到来的每一个光子。但是&#xff0c;当两个或多个光子同时到达时&#xff0c;计数器会将其记录为单个脉冲&#xff0c;从而只计数一次。当连续光子到达时&#xff0c;离散光…

基于YOLOv8深度学习的CT扫描图像肾结石智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…