链表基础知识详解

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含两部分:一部分是数据域,用于存储实际的数据元素;另一部分是指针域,用于指向链表中的下一个节点。链表中的节点可以动态地添加、删除,其大小可以根据需要进行扩展或缩小。

链表的基础知识

  1. 节点的定义:链表中的每个节点通常包含一个数据域和一个指针域。数据域用于存储数据,指针域用于指向下一个节点。
  2. 链表的类型:链表有多种类型,包括单向链表、双向链表、循环链表等。单向链表中的节点只有一个指针,指向下一个节点;双向链表中的节点有两个指针,一个指向前一个节点,一个指向下一个节点;循环链表中的尾节点指向头节点,形成一个闭环。
  3. 链表的操作:链表的基本操作包括插入、删除、查找等。由于链表是通过指针链接的,因此这些操作通常只需要修改指针的指向,而不需要移动其他元素。

链表的功能与应用

链表在许多场合下都有广泛的应用。例如,在社交网络中,链表可以用来表示用户的关注列表或好友列表;在电商平台中,链表可以用来管理商品信息,方便进行商品的遍历和筛选;在汽车导航系统中,链表可以用来存储道路信息,规划最优的行车路线;在音乐播放器中,链表可以用来表示播放列表,方便进行歌曲的切换和推荐。

链表的优缺点

优点

  1. 动态数据结构:链表的大小可以在运行时增加或减少,因此没有内存浪费。
  2. 易于插入和删除:在链表中插入或删除节点只需要更新指针的指向,时间复杂度为O(1)。

缺点

  1. 内存使用:链表中的每个节点都包含一个指针,这会增加额外的内存开销。
  2. 遍历困难:访问链表中的元素需要从头节点开始逐个遍历,效率较低。
  3. 反向遍历困难:在双向链表中,反向遍历需要额外的指针,而在单向链表中则无法直接进行反向遍历。

总的来说,链表是一种非常灵活的数据结构,适用于处理不固定长度的数据。在实际应用中,应根据具体需求选择合适的数据结构。
class Node:
def init(self, data=None):
self.data = data
self.next = None

class LinkedList:
def init(self):
self.head = None

# 在链表尾部插入节点  
def append(self, data):  if not self.head:  self.head = Node(data)  else:  current = self.head  while current.next:  current = current.next  current.next = Node(data)  # 在链表头部插入节点  
def insert(self, data):  new_node = Node(data)  new_node.next = self.head  self.head = new_node  # 删除指定数据值的节点  
def delete(self, data):  if self.head is None:  return  if self.head.data == data:  self.head = self.head.next  return  current = self.head  while current.next:  if current.next.data == data:  current.next = current.next.next  return  current = current.next  # 查找指定数据值的节点  
def search(self, data):  current = self.head  while current:  if current.data == data:  return True  current = current.next  return False  # 遍历链表并打印节点数据  
def display(self):  elements = []  current_node = self.head  while current_node:  elements.append(current_node.data)  current_node = current_node.next  print(elements)  

使用链表

linked_list = LinkedList()

插入节点

linked_list.insert(1)
linked_list.insert(2)
linked_list.append(3)

显示链表内容

linked_list.display() # 输出: [2, 1, 3]

查找节点

print(linked_list.search(2)) # 输出: True
print(linked_list.search(4)) # 输出: False

删除节点

linked_list.delete(1)
linked_list.display() # 输出: [2, 3]

在上面的代码中,我们定义了一个Node类来表示链表中的节点,每个节点包含一个数据域data和一个指针域next。我们还定义了一个LinkedList类来表示整个链表,这个类包含以下方法:

append(data): 在链表的尾部插入一个节点。
insert(data): 在链表的头部插入一个节点。
delete(data): 删除链表中第一个值为data的节点。
search(data): 查找链表中是否存在值为data的节点。
display(): 遍历链表并打印所有节点的数据。
之后,我们创建了一个LinkedList的实例linked_list,并演示了如何插入节点、搜索节点、删除节点以及遍历链表。

注意,上面的链表实现是简单的单链表,不支持反向遍历。如果需要反向遍历或者进行更复杂的操作,可以考虑实现双向链表或循环链表。同时,链表还可以根据实际需求进行扩展,例如实现排序功能、分割链表等。

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

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

相关文章

计算机基础专升本笔记十二-Excel常用快捷键大全

计算机基础专升本笔记十二-Excel常用快捷键大全 Excel常用快捷键 按键作用Ctrl 0隐藏列Ctrl 1设置单元格格式Ctrl 2添加或取消字体加粗Ctrl 3添加或取消字体倾斜Ctrl 4添加或取消下划线Ctrl 5添加或取消删除线Ctrl 6隐藏或显示图形Ctrl 7隐藏工具栏Ctrl 8隐藏或显示…

虾皮、lazada店铺运营攻略,如何搭建高效、稳定的自养号测评系统

随着电子商务的蓬勃发展,越来越多的人选择在虾皮这样的电商平台上开设店铺,以实现创业梦想。但如何在众多店铺中脱颖而出,成为消费者的首选?本文将为您详细解答“怎么样做好虾皮店铺”,并提供一些实用的运营建议。 一、怎么样做…

【文献计量】安装endnote注意事项

1.前言 EndNote 是一款广受学者、研究人员、学生和图书管理员等使用的参考管理软件。它由 Clarivate Analytics 开发,用于管理文献引用和编排参考文献列表。EndNote 可以帮助用户在撰写科研论文、书籍或任何学术出版物时,高效地组织、管理和引用研究资料…

C++ 有边数限制的最短路 Bellman_ford算法(带负权边)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。 请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible。 注意:图中可能 存在负权回路…

第3部分 原理篇3可验证凭证(VC)(1)

3.3. 可验证凭证 3.3.1. 本节内容概述 本聪老师:今天开始去中心化身份中另一个最重要的概念可验证凭证(verifiable credential)的学习。凭证,也就是证件,在人类生活中不可或缺。可验证凭证实现了凭证的机器可读、加密…

Vmware创建共享文件夹

具体设置步骤如下: 打开 “设置 -> 选项 -> 共享文件夹” 点击 “选项 -> 共享文件夹 ->选择总是开启 ->添加” 添加共享文件夹 选择主机路径和设置名称 选择启用此共享,并且点击完成退出。 挂载操作 在root用户下执行具体命令如下&…

前端项目代码规范 ----- 配置eslint规范,增加Git工作流规范

已实践,管用 ------ 在项目触发eslint规范 vscode配置eslint格式化vue,eslint不好使的问题_vue/html-indent-CSDN博客 增加Git 工作流 前端规范之Git工作流规范 Husky lint-staged_.lintstagedrc-CSDN博客 ------ 另外,在package.js…

mysql 时间精度问题

timestamp到2038年,还有14年时间,一个系统如果能活到那一刻也是相当不错了。 这里先看一下个datetime的问题,下面的插入数据的时间戳是2024-03-06 21:20:50.839 INSERT INTO psi_io_balance ( id, as_id, bill_date, order_id, busi_type, direction, c…

JavaScript事件代理

事件代理 事件代理,通俗来讲,就是把一个元素响应事件(click、keydown......)的函数委托到另一个元素 应用场景一般都是在有一个列表之中有大量的列表项,需要在点击列表项的时候响应一个事件 这时候就可以事件委托&a…

安卓简单登录

注意 有的朋友不知道登录咋写,这里我就简单给出相应代码,用的本地存储,没用网络请求,有需要可以替换成想要的,废话不多上代码 登录 import androidx.appcompat.app.AppCompatActivity;import android.content.Context…

JVM入门篇(面试前速补)

近期看看JVM,看了狂神说入门教学,总结下给大家。 文章目录 1、JVM的位置2、JVM的结构体系3、类加载器及双亲委派机制3.1、类加载器作用3.2、类加载器类型3.3、双亲委派机制 * 4、沙箱安全机制5、Native、方法区5.1、Native(本地方法栈引用&a…

探秘Rpc远程调用:深入了解RPC远程调用的原理及应用(一)

本系列文章简介: 本系列文章将深入探讨RPC远程调用的原理和应用,帮助大家更好地理解RPC远程调用的工作原理,以及它在分布式系统中的实际应用场景。我们将介绍RPC远程调用的基本原理和工作流程,并探讨不同的协议和实现方式。此外&a…

【SQL】1068. 产品销售分析 I

题目描述 leetcode题目:1068. 产品销售分析 I 写法 select Product.product_name, Sales.year, Sales.price from Sales left join Product on Sales.product_id Product.product_id记录细节:加上表名检索效率更高。 -- ERROR: 时间超出限制 > 加…

181基于matlab的利用LMS算法、格型LMS算法、RLS算法、LSL算法来估计线性预测模型参数a1和a2

基于matlab的利用LMS算法、格型LMS算法、RLS算法、LSL算法来估计线性预测模型参数a1和a2;预测信号由二阶线性预测模型产生。2.利用LMS算法和RLS算法将一个叠加有噪声的信号实现噪声消除,恢复原始信号。有22页试验分析文档。(包括程序在内&…

华为OD机试 - 疫情扩散时间计算 - 矩阵(Java 2024 C卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷&am…

解决 Python 脚本无法生成结果的问题

我们在python编程时,始终无法生成想要的成果,其实问题并非单一的,可能有多种情况导致的结果;例如:语法错误、运行时错误、依赖项问题、权限问题、死锁或阻塞等问题,下面我将举例说明遇到这些问题该如何解决…

通过 python 和 wget 批量下载文件(在Linux/Ubuntu/Debian中测试)

首先创建一个文本文件d.txt, 一行一个链接。 你可以使用简单的 Python 脚本逐行读取文件 (d.txt) 中的链接,并使用 wget 下载文件: import subprocess# File containing download links (replace with your file path) file_path d.txt# Function to …

Python 爬虫快速入门

1. 背景 最近在工作中有需要使用到爬虫的地方,需要根据 Gitlab Python 实现一套定时爬取数据的工具,所以借此机会,针对 Python 爬虫方面的知识进行了学习,也算 Python 爬虫入门了。 需要了解的知识点: Python 基础语…

vue 选项/生命周期钩子 详解

通俗地讲,生命周期即Vue实例或组件从创建到被消灭的一系列过程,中间的各个节点被称为钩子.例如:vue.js中created方法是一个生命周期钩子函数,每一个阶段都会有一个钩子函数,方便开发者在不同阶段处理不同逻辑。例如&am…

Java多线程——对象的原子更新

目录 引出对象原子更新AtomicReferenceAtomicLongFieldUpdaterABA问题 Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——对象的原子更新 对象原子更新 AtomicReference package cn.test3; import lombok.AllAr…