首页 > 编程语言 >数据结构--单向链表篇(python实现)

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

时间:2024-07-10 10:55:31浏览次数:12  
标签:index -- pred self next 链表 python 节点

写在开头

链表(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的复杂度),添加节点就是组织上又加入了一个人,你可以选择把它放在组织中的任何位置,前提是得在组织中,你得让他的上级知道它有了下级,并且给它指定一个下级(如果有的话),删除节点就是这个人在这个组织中没有上线和下线了(将指向该节点的指针指向别处),没人搭理你了,你就被删除了。

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

标签:index,--,pred,self,next,链表,python,节点
From: https://blog.csdn.net/weixin_74068942/article/details/140286108

相关文章

  • 文化探讨:中国何时开始以国家形式出现在人类历史中
    相关:https://www.youtube.com/watch?v=0YJdVN7q8Ew中国以国家形式出现可以追述到轩辕黄帝时期,至今大约6000年前。那个时候开始,中国的先祖便选择了部落间的合作与融合,也是从那个时间开始便有国家形式的雏形,而到了4000年前大禹创建九鼎也象征着正式从部落文明进入到了封建国家文......
  • 正则表达式详解
    1.正则表达式的作用(1)文本搜索和匹配:可以用来搜索、匹配和替换特定模式的文本。          比如,查找所有符合特定格式的邮箱地址、电话号码等。(2)数据验证:可以用来验证用户输入是否符合特定的格式要求。     比如,验证电子邮件地址、密码复杂度等。(3)数据......
  • 在Ubuntu中安装docker最新的docker(被墙)(转)
    在目前的情况下download.docker.com访问不是特别稳定的情况下,可以使用阿里的地址来进行更新一、安装1、检查环境1.1卸载旧版dockersudosuaptremovedockerdocker-enginedocker.iocontainerdrunc2、安装依赖apt-yinstallca-certificatescurlgnupglsb......
  • 基于JavaWeb的酒店管理系统(源码+数据库+项目展示文档+部署文档)
    酒店管理系统报告系统概述酒店管理系统是为酒店设计开发的管理平台,旨在提供完善的管理功能以支持酒店的日常运营和管理。该系统基于JavaWeb技术栈开发,使用Servlet和JSP作为主要服务端技术,前端设计采用Layui和jQuery框架,通过美观的Windows风格界面提供用户友好的操作体验。系......
  • MyBatisPlus 实现数据库 CURD 操作
    BaseMapper接口方法介绍BaseMapper中提供了CRUD方法,具体方法如下://插入一条记录intinsert(Tentity);//根据entity条件,删除记录intdelete(@Param(Constants.WRAPPER)Wrapper<T>wrapper);//删除(根据ID批量删除)intdeleteBatchIds(@Param(Constants.COLLEC......
  • 题解与求助 P2347 [NOIP1996 提高组] 砝码称重
    P2347[NOIP1996提高组]砝码称重题目描述设有$1\mathrm{g}$、$2\mathrm{g}$、$3\mathrm{g}$、$5\mathrm{g}$、$10\mathrm{g}$、$20\mathrm{g}$的砝码各若干枚(其总重$\le1000$),可以表示成多少种重量?输入格式输入方式:$a_1,a_2,a_3,a_4,a_5,a_6$(表示$1\mathrm{......
  • 基于Sonar和.editorconfig的代码lint
    基于Sonar和.editorconfig的代码lint在项目根目录下创建Directory.Build.props文件,在里面引入SonarAnalyzer.CSharp包:<Project><PropertyGroup><TargetFramework>net8.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nu......
  • 头疼,大事务问题如何解决?
    前言最近有个网友问了我一个问题:系统中大事务问题要如何处理?正好前段时间我在公司处理过这个问题,我们当时由于项目初期时间比较紧张,为了快速完成业务功能,忽略了系统部分性能问题。项目顺利上线后,专门抽了一个迭代的时间去解决大事务问题,目前已经优化完成,并且顺利上线。现给大家......
  • 成都某报项目部署
    系统远程部署流程本地环境改为线上环境​ 将本地的jdbc.properties中的数据库连接和fileUrl等路径修改为线上的地址后端打包打包完成后会在target文件夹下生成一个war包远程连接win+r输入mstsc会弹出一个窗口输入远程服务器的地址然后输入账号密码就可以进去了......
  • Windows LAPS(Local Administrator Password Solution)是一种由微软提供的工具和解决方
    WindowsLAPS(LocalAdministratorPasswordSolution)是一种由微软提供的工具和解决方案,旨在管理Windows操作系统中本地管理员账户的密码。它的设计初衷是提高系统安全性,特别是防止在企业环境中多台计算机上使用相同的本地管理员密码所带来的安全风险。特点和工作原理个性化密......