链表1-单链表(Python实现)

2023-10-28

一、链表定义

1、线性表需求

线性表的基本需求有两点:

  • 能够找到线性表的首元素(head)。
  • 从线性表的任何一个元素开始,能够找到它之后的下一个元素(next)。

2、什么是链表(链接表)

基于链接技术实现的线性表称为链接表(简称 链表)。链接技术实现原理:

  • 把表中的元素 分别 存储在 独立的存储块(称为链表的 结点 )中。
  • 在前一节点中 显示 的记录下一节点。

二、单链表(single linked list)

1、定义

单向链表 是链接方向为单向的链表。简称 单链表 或者 链表,一般情况下,我们说的链表也是指单向链表。一个单链表的 结点 包含两个部分,第一个部分(元素域)存储关于节点的信息(如表示元素的数据项),第二部分(链接域)存储下一个节点的地址。在这里插入图片描述

(图来自维基百科)

(1)表头变量(表头指针)

可以用一个变量表示单链表的首结点的引用(如上图的head),这样的变量称为表头变量或者表头指针。

(2)空链接

为了表示一个单链表的结束,最后一个节点的第二个部分需设置一个表示结束的值在Python里,用None表示,这个值称为 空链接

2、节点的算法实现

class LNode :
    def __init__(self, elm, nxt):
        self.elem = elm
        self.next = nxt

3、单链表的算法实现

这是一个最简单的单链表。

class LList:
    def __init__(self):
        """
        实例属性head表示首结点的引用
        """
        self.head = None

三、单链表的操作

操作都在类LList里面定义为方法。

1、初始化单链表

把表头变量head的值设置为None。

2、判断表是否为空

将表头变量head的值与空值进行比较。

 def is_empty(self):
        """判断单链表是否为空"""
        return self.head is None

3、插入元素

插入元素可以分为表头插入,定位插入,表尾插入。和顺序表的不同的是,在单向链表中插入元素时,并不需要移动已有的元素,而是修改链接,接入新的节点。

(1)表头插入

表头插入元素只需要两步即可完成。第一步:将原单链表首节点的链接存入新节点的链接域next。第二步:修改表头变量,使之指向新节点。

代码实现:

    def prepend(self, elem):
        """
        表头插入元素。
        :param elem: element
        """
        self.head = LNode(elem, self.head)

时间复杂度分析:

因为可以通过head直接找到首结点,所以时间复杂度为常量时间复杂度O(1)。

(2)定位插入

定位插入是指在链表的某个位置插入一个新结点。一般需要三步可以完成。第一步:从首结点开始找,找到该位置的前一个节点(pre)。第二步:将前一个节点原来所指向的链接域next存入新结点的链接域next。第三步:修改前一个结点的链接域next,使之指向新结点。

代码实现:

q = LNode(13) # 创建一个新节点
q.next = pre.next # 将前一个节点原来所指向的链接域next存入新结点的链接域next
pre.next = q # 修改表头变量,使之指向新节点。

时间复杂度:

定位插入元素的时间主要消耗在查找元素。假设单链表有n个结点,在各位置插入时,查找元素次数如下:

结点索引 查找次数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链表1-单链表(Python实现) 的相关文章

  • 使用到达时间差对信号进行三边测量

    我在寻找或实现寻找信号源的算法时遇到一些麻烦 我的工作目标是找到声音发射器的位置 为了实现这一点 我使用了三个麦克风 我正在使用的技术是多点定位这是基于到达时间差 The 到达时间差使用发现每个麦克风之间互相关接收到的信号 我已经实现了算法
  • 欧拉项目 45

    我还不是一名熟练的程序员 但我认为这是一个有趣的问题 我想我应该尝试一下 三角形 五边形 六边形 数字由以下生成 公式 三角形 T n n n 1 2 1 3 6 10 15 五边形 P n n 3n 1 2 1 5 12 22 35 六角
  • 优先连接,Matlab 中的复杂网络

    大家好 我现在正在 MATLAB 中研究优先附件模型 在理解以下内容时遇到一些困难 假设我一开始有 4 个节点 连接如下 time 0 1 lt gt 2 3 lt gt 4 在下一个时间步骤中 我添加一个节点和 4 个连接 然后添加另一个
  • 在矩阵/位图中查找质量簇

    这是此处发布的问题的延续 在 2D 位图上查找质心 https stackoverflow com questions 408358 finding the center of mass on a 2d bitmap正如给出的例子 它讨论了
  • 压缩很多小字符串的算法?

    我正在寻找一种压缩小 ASCII 字符串的算法 它们包含大量字母 但也可以包含数字和很少的特殊字符 它们很小 平均约为 50 100 字节 最多 250 个字节 例子 Android show EditText setError above
  • 优化两个三位数乘积的最大回文数?

    我正在研究一个面试问题 我被问到这个问题 我应该编写一个程序 从两个三位数的乘积中找到最大的回文数 这里是question https projecteuler net problem 4 我想出了这种从底部开始的蛮力方法 public c
  • 如何提高洪水填充例程的性能?

    我正在我的应用程序中实现四路洪水填充 伪代码如下 Flood fill node target color replacement color 1 If the color of node is not equal to target co
  • 将数字的各个数字部分相加/求和的最快方法

    不久前 我在数学论坛上看到一个问题 其中一个人正在讨论一遍又一遍地将数字中的数字相加 直到达到个位数 即 362 将变成 3 6 2 这将变成 11 然后 11 将变成 1 1 将变成 2 因此 362 将返回2 我写了一些很好的代码来得到
  • 在Python中确定句子中2个单词之间的邻近度

    我需要确定 Python 句子中两个单词之间的接近度 例如 在下面的句子中 the foo and the bar is foo bar 我想确定单词之间的距离foo and bar 确定之间出现的单词数foo and bar 请注意 该词
  • 逐字遍历句子

    如何逐字遍历任何给定的句子 java中有内置函数吗 我不知道如何开始 像这样的事情 String sentence Your sentence here String words sentence split s splits by whi
  • 为什么我们需要检测链表中的循环

    我看到很多关于如何检测链表中的循环的问答 但我想了解的是我们为什么要这样做 换句话说 检测链表中的循环的实际用例是什么 在现实生活中 您可能永远不需要检测链表中的循环 但是执行此操作的算法很重要 我在现实生活中多次使用它们 例如 我经常会递
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 带有元数据的 scipy kdtree

    我目前正在寻找一种方法来构建几个 kd 树以快速查询一些 n 维数据 但是 我对 scipy KD 树算法有一些问题 我的数据包括id gt data somedata coordinate x y 我希望能够基于坐标和 k 最近邻居的 i
  • 使用 stl sort 对表进行排序

    我有一个巨大的表 约 50Gb 格式为 i j k 来自稀疏矩阵 存储为 uint32 t idx1 idx2 float vals uint32 t tablesize 我想使用给定的比较函数 即 idx1 和 idx2 的函数 对其进行
  • 查找两个大小为 n 的数组中第 n 大数的算法

    我有这个问题 给定两个大小为 n 的排序列表 存储在数组中 找到 O log n 计算并集中第 n 大元素的算法 两个列表 我可以看到这里可能有一个技巧 因为它需要第 n 个最大的元素 并且数组的大小也是 n 但我不知道它是什么 我在想我可
  • 计算总和等于 k ​​的子集数量

    给定一个数组 我们需要找出总和恰好等于给定整数 k 的子集的数量 请针对这个问题提出一个最佳算法 这里不需要实际的子集 只需计数即可 该数组由整数组成 可以是负数也可以是非负数 例子 数组 gt 1 4 1 10 5 绝对值总和 gt 9
  • 读取4个点的坐标。他们做一个正方形吗?

    我计算点之间的距离 如果距离相等 则点构成一个正方形 否则不 仅当我按以下顺序读取坐标 A x y B x y C x y D x y 或相反时 我的代码才有效 但是如果我这样读 例如 A x y B x y D x y C x y 它将不
  • 大小为 n 的数组,其中一个元素 n/2 次

    给定一个由 n 个整数组成的数组 其中一个元素出现超过 n 2 次 我们需要在线性时间和恒定的额外空间中找到该元素 YAAQ 又一个数组问题 我有一种偷偷的怀疑 这类似于 在 C 中 We don t need an array publi
  • 插入排序 - 如何接受输入并打印排序后的数组

    我试图做一个插入排序程序 它接受任何数据类型 Int Double String 然后打印排序后的数组 我知道我的代码可以工作 但我无法找出真正的问题 import java util public class MyInsertionSor
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于

随机推荐

  • VS2022 C# 自定义用户控件(PictureBox)

    文章目录 1 创建自定义控件 PictureBox 1 1 新建自定义控件类库 1 2 添加pictureBox控件 1 3 写显示图像的程序代码 1 4 生成dll 2 调用自定义的控件 2 1 新建窗体应用 2 2 添加控件dll 2
  • 面试前端实习生 经验(1)

    一 公司情况 规模 5 60人 前端项目组 6 1 正式员工 实习生 位置 杭州余杭 二 大概问题 1 谈谈深拷贝和浅拷贝的理解 2 你了解的css3新增的东西 3 垂直居中怎么实现 4 谈谈css的核心模块 大概是答padding mar
  • DBCP连接池的.properties文件配置信息

    driverClassName com mysql cj jdbc Driver url jdbc mysql localhost 3306 jdbcdemo serverTimezone GMT 2B8 驱动包用的是mysql conne
  • 距离向量路由算法实现java_距离向量路由协议及优化链路状态路由协议

    1 距离向量路由算 距离向量路由算法要求每个路由器维护一张距离表和路由表 并在表中给出到每个已知目的地的最短距离和路径 在距离表中 列表示和这个节点直接相连的邻居 表中的行表示目的节点 而表中的元素表示 距离 距离 可以是跳跃次数 时延或丢
  • ADAS倒车雷达超声波传感器elmos524.03驱动

    最近一直在思考一个问题 什么是知识 什么是能力 自己的价值在哪里 感觉自己做笔记做的太少 燕过却不留声 最近也想总结下自己到底做过什么 固以此篇献给做汽车电子的朋友 以及想以超声波作为工程化落地的道友们 如有不对之处 欢迎指教 话不多说 测
  • 两个字符串相加——字符串进位的实践

    一 二进制求和 1 1 题目 给你两个二进制字符串 返回它们的和 用二进制表示 输入为 非空 字符串且只包含数字 1 和 0 1 2 题解 我们可以借鉴 列竖式 的方法 末尾对齐 逐位相加 在十进制的计算中 逢十进一 二进制中我们需要 逢二
  • Python遍历文件夹存入list,并合并多文件夹中后缀名相同的文件

    目前一共有五个文件夹 每个文件夹中有多个csv文件 文件夹分别为N N1 N2 N3 N4 每个文件夹中的csv文件都是以子文件夹名称 日期命名 均有相同列 Unnamed 0 默认第一列 需求就是使用for循环将每个日期的五个csv表格合
  • 默认值 唯一性约束

    默认值约束即DEFAULT用于给数据表中的字段指定默认值 即当在表中插入一条新记录时若未给该字段赋值 那么 数据库系统会自动为这个字段插人默认值 其基本的语法格式如下所示 字段名 数据类型 DEFAULT 默认值 1 示例 MySQL命令
  • get 几种传参方式

    1 地址栏传参数 ApiOperation get2控制类 GetMapping get2 public String get2 ApiParam 用户名 String username return hello username 可以直接
  • 加脱壳、加解密、破解辅助及其源码

    PE辅助工具 程序名称 作者 说明 PETool v0 45 beta MackT PE文件信息查看编辑工具 VC源码 PE Labs 1 0 Latigo PE文件信息查看工具 Win32ASM源码 moveres Spring W 移动
  • 彩灯循环控制系统 电路与电子技术 课程设计

    设计目的 本次课程设计要设计一个彩灯循环控制器 首先要分析设计要求 从要实现四花样入手推导出要使用的芯片 可通过八位右移寄存器74LS164实现八个彩灯的向右移动 从它的右移输入端输入四种码来实现它的四种花样 根据四种花样确定这四种码 可通
  • 虚拟机监视器(VMM)

    虚拟机监视器 VMM 是一个系统软件 可以维护多个高效的 隔离的程序环境 该环境支持用户直接去访问真实硬件 而这样的程序环境就称为虚拟机 虚拟机是一个真实存在的计算机系统的硬软件副本 其中部分虚拟处理器指令子集以本地 native 方式执行
  • lduoj_2021年初寒假训练第41场

    2021年初寒假训练第41场 A 复制 粘贴 B 足球联赛 C 捕食关系 D 幻方 E 求和 F 猜歌名 A 复制 粘贴 Description 小y是一个聪明的程序员 但是他懒到了极致 在输入程序时甚至不愿意多打一行代码 有一次 小y发现
  • 链表专题(C语言)

    本文目录 一 初识链表 1 链表的基本概念 2 链表和顺序表的区别 二 链表的基本操作 1 链表的初始化 2 链表的创建 头插法 尾插法 3 打印链表 4 获得链表的长度 5 获得链表中间结点 6 在任意
  • 偏度和峰度:快速指南

    介绍 偏度本质上 是描述性统计中常用的度量 它表征数据分布的不对称性 而峰度则确定分布尾部的重量 在实践数据科学时 理解数据的形状至关重要 它有助于了解最多信息所在并分析给定数据中的异常值 在本文中 我们将了解统计中数据的形状 偏度和峰度的
  • java如何写一个简单的定时任务?

    使用java自带类Timer 通过import java util Timer导入Timer类 定时任务实现通过Timer的scheduler方法 scheduler方法包括三个入参 分别是定时任务 delay 任务执行后多久执行 单位ms
  • uni-app编译H5,复制功能,兼容安卓和ios

    在用uni app写项目的时候 编译H5 复制功能没法使用uni app自己封装的方法 特此记录 copyText node if node return var result 将复制内容添加到临时textarea元素中 var tempT
  • Struts2的OGLN表达式

    h4 OGLN表达式学习 h4 ol li 访问值栈中的普通属性 userName li ol
  • Gravatar头像注册

    遇到某站换头像只支持Gravatar 就去鼓捣了一下这款全球通用头像 注册获得 Gravatar 头像的步骤 访问Gravatar官方注册地址 https cn gravatar com 将鼠标移动到 Log in Sign up 点击进入
  • 链表1-单链表(Python实现)

    一 链表定义 1 线性表需求 线性表的基本需求有两点 能够找到线性表的首元素 head 从线性表的任何一个元素开始 能够找到它之后的下一个元素 next 2 什么是链表 链接表 基于链接技术实现的线性表称为链接表 简称 链表 链接技术实现原