十年JAVA搬砖路——数据结构线性结构
线性结构
线性表是一种数据结构,用于存储一组有序的数据元素。它的特点是数据元素之间存在一对一的关系,每个元素只有一个前驱和一个后继(除了第一个元素和最后一个元素)。线性表可以用数组或链表来实现。
数据是指事物的符号表示,可以是数字、字符、图像、声音等。数据可以通过线性表来组织和存储,以便进行操作和处理。线性表提供了一种简单而有效的方式来管理和访问数据,使得数据的存储和检索变得更加方便和高效。
线性表可以通过多种方式实现,其中最常见的两种方式是使用数组(顺序存储)和使用链表(链式存储)。
**1. 顺序存储:**线性表的顺序存储是通过数组来实现的。数组将元素按照顺序连续存储在内存中,每个元素占据固定大小的内存空间。顺序存储的优点是可以通过索引直接访问元素,访问速度快。但是插入和删除操作需要移动元素,效率较低。
2. 链式存储:线性表的链式存储是通过链表来实现的。链表由节点(Node)组成,每个节点包含数据和指向下一个节点的指针(或引用)。节点在内存中可以非连续存储,通过指针将它们连接起来。链式存储的优点是插入和删除操作只需要修改指针的指向,效率较高。但是链式存储不支持随机访问,需要从头节点开始遍历到目标位置才能访问元素。
顺序存储 数组的基本操作:
-
插入操作:在顺序存储结构中插入一个新元素,需要将插入位置之后的所有元素后移一位,然后将新元素放入指定位置。
-
删除操作:从顺序存储结构中删除一个元素,需要将删除位置之后的所有元素前移一位,覆盖被删除的元素。
-
访问操作:通过索引访问顺序存储结构中的元素,可以直接通过索引值来访问对应位置的元素。
-
查找操作:在顺序存储结构中查找指定元素,需要遍历整个存储结构,逐个比较元素的值,直到找到目标元素或者遍历结束。
-
更新操作:通过索引定位到顺序存储结构中的某个元素,然后修改该元素的值。
• 线单向性链表常见的操作包括:
-
插入操作:
- 头部插入:创建一个新节点,设置其数据值,并使其指针指向当前的第一个节点。更新头指针指向新节点。
- 尾部插入:创建一个新节点,设置其数据值,并使其指针指向 null。更新最后一个节点的指针指向新节点。
- 指定位置插入:定位到指定位置,创建一个新节点,设置其数据值,并使其指针指向该位置的下一个节点。更新前一个节点的指针指向新节点。
-
删除操作:
- 删除第一个节点:更新头指针指向第二个节点,并从链表中移除第一个节点。
- 删除最后一个节点:遍历链表找到倒数第二个节点,并将其指针指向 null。
- 删除指定节点:定位到要删除的节点,更新前一个节点的指针以跳过要删除的节点,并从链表中移除该节点。
-
遍历操作:
- 从头节点开始,通过跟随指针的指向依次遍历每个节点,直到到达链表的末尾。对每个节点执行所需的操作。
-
搜索操作:
- 从头节点开始,遍历链表并将每个节点的数据值与目标值进行比较。返回找到的节点或指示元素未找到。
• 线单循环链表操作:
插入操作:
头部插入数据:
- 创建一个新节点并设置其数据。
- 如果列表为空(head 为空),将新节点的下一个指针设置为自身,并将 head 指针更新到新节点。
- 如果列表不为空,请将新节点的下一个指针设置为当前头节点。
- 遍历列表以查找最后一个节点(下一个指针指向当前头节点的节点)。
- 更新最后一个节点的下一个指针以指向新的头节点。
- 更新指向新节点的头部指针。
中间或者尾部插入数据: - 使用要插入的数据创建一个新节点。
- 遍历链表,直到到达所需位置的节点。还要跟踪上一个节点。
- 设置新节点的下一个指针到上一个节点的下一个节点。
- 设置上一个节点的下一个指针到新节点。
- 如果所需位置位于链表的末尾(即最后一个节点),请更新新节点的下一个指针以指向头节点。
删除操作
- 通过遍历链表并跟踪上一个节点来查找要删除的节点。
- 更新上一个节点的下一个指针,跳过要删除的节点,指向下一个节点。
- 如果要删除的节点是头节点,请更新头指针以指向下一个节点。
- 如果要删除的节点是最后一个节点,请更新上一个节点的下一个指针以指向头节点。
遍历操作/搜索操作
若要遍历单循环链表,可以从头节点开始并继续遍历,直到再次到达头节点。由于它是一个循环链表,因此您需要通过检查是否再
次到达头节点来确保不会陷入无限循环。
• 双向链表操作:
插入操作
- 创建一个新的节点,并将要插入的值存储在该节点中。
- 如果链表为空,则将新节点设置为链表的头节点。
- 如果要插入的位置是链表的头部,则将新节点插入到链表的头部,并将原来的头节点设置为新节点的后继节点。既新节点的后续节点指向原来的头结点,原来头节点的前驱节点指向新节点。
- 如果要插入的位置不是链表的头部,则需要遍历链表找到要插入位置的前一个节点。
- 将新节点的后继节点设置为前一个节点的后继节点,并将新节点的前驱节点设置为前一个节点。
- 将前一个节点的后继节点设置为新节点,并将新节点设置为后继节点的前驱节点。
删除操作
- 如果链表为空,则无法进行删除操作。
- 如果要删除的位置是链表的头部,则将头节点的后继节点设置为新的头节点,并将新的头节点的前驱节点设置为None。
- 如果要删除的位置不是链表的头部,则需要遍历链表找到要删除位置的节点。
- 将要删除节点的前驱节点的后继节点设置为要删除节点的后继节点。
- 如果要删除节点的后继节点不为空,则将要删除节点的后继节点的前驱节点设置为要删除节点的前驱节点
相关文章:
十年JAVA搬砖路——数据结构线性结构
线性结构 线性表是一种数据结构,用于存储一组有序的数据元素。它的特点是数据元素之间存在一对一的关系,每个元素只有一个前驱和一个后继(除了第一个元素和最后一个元素)。线性表可以用数组或链表来实现。 数据是指事物的符号表…...
Mybatis为什么需要预编译等一系列问题
1 SQL 预编译 SQL 预编译是一种提高数据库访问效率的技术,它通过将 SQL 语句预编译并存储在数据库中,减少每次执行时需要进行解析和编译的开销,从而提高数据库访问的效率。 在预编译阶段,SQL 语句会被解析并转换为可执行的二进制…...

【JVM基础】JVM入门基础
目录 JVM的位置三种 JVMJVM体系结构类加载器双亲委派机制概念例子作用 沙箱安全机制组成沙箱的基本组件 NativeJNI:Java Native Interface(本地方法接口)Native Method Stack(本地方法栈) PC寄存器(Program…...
【SpringBoot】详细介绍Spring Boot中@Component
在Spring Boot中,Component是一个通用的注解,用于标识一个类是Spring框架中的组件。Component注解是Spring的核心注解之一,它提供了自动扫描和实例化bean的功能。 具体来说,Component注解的作用是将一个普通的Java类转化为Spring…...
Redis执行lua脚本-Time函数-获取当前时间
演变过程: TIME 命令返回当前服务器的时间,包含两个条目 Unix 时间戳和这一秒已经过去的微秒数。 eval " local res redis.call(time); return res; " 0 eval " local current_time redis.call(TIME) local unix_timestamp tonumb…...
前端无需install快速调试npm包,Console-Import使用
Console-Import是一个Chrome扩展插件,可以方便地从Chrome控制台导入JavaScript和CSS资源。它可以帮助我们在开发过程中快速调试和测试第三方库或代码。 下载地址 安装 要安装Console-Import,请在Chrome网上应用店搜索“Console-Import”,然…...

构建稳定的爬虫系统:如何选择合适的HTTP代理服务商
在构建一个稳定、高效的爬虫系统中,选择合适的HTTP代理服务商是至关重要的一步。本文将介绍如何选取可靠且性能优秀的HTTP代理服务供应商,来完成搭建一个强大而稳定的爬虫系统。 1.了解不同类型和特点 -免费公开代理服务器:提供免费但可能存在限制或不…...
Python爬虫基础:使用Scrapy库初步探索
Scrapy是Python中最流行的网页爬虫框架之一,强大且功能丰富。通过Scrapy,你可以快速创建一个爬虫,高效地抓取和处理网络数据。在这篇文章中,我们将介绍如何使用Scrapy构建一个基础的爬虫。 一、Scrapy简介及安装 Scrapy是一个用…...

MacBookPro重装系统图文教程
关机 长按电源按钮10s即可强制关机 快捷键选择 Intel Command-R:获得安装过的最新的 macOS,但不会升级到最高版Option-Command-R:获得与 Mac 兼容的最新版 macOSShift-Option-Command-R:获得 Mac 自带的 macOS 或者与它最接近且…...
Android 6.0长按电源键添加重启菜单
重启图标:frameworks/base/core/res/res/drawable-hdpi/ic_lock_power_reboot_alpha.pngframeworks/base/core/res/res/drawable/ic_lock_power_reboot.xml <?xml version"1.0" encoding"utf-8"?> <!-- Copyright (C) 2014 The And…...

Python股票交易---均值回归
免责声明:本文提供的信息仅用于教育目的,不应被视为专业投资建议。在做出投资决策时进行自己的研究并谨慎行事非常重要。投资涉及风险,您做出的任何投资决定完全由您自己负责。 在本文中,您将了解什么是均值回归交易算法ÿ…...

机器人制作开源方案 | 桌面级机械臂--本体说明+驱动及控制
一、本体说明 1. 机械臂整体描述 该桌面级机械臂为模块化设计,包含主机模块1个、转台模块1个、二级摆动模块1个、可编程示教盒1个、2种末端执行器、高清摄像头,以及适配器、组装工具、备用零件等。可将模块快速组合为一个带被动关节的串联3自由度机械臂…...

有哪些前端调试和测试工具? - 易智编译EaseEditing
前端开发调试和测试工具帮助开发人员在开发过程中发现和修复问题,确保网站或应用的稳定性和性能。以下是一些常用的前端调试和测试工具: 调试工具: 浏览器开发者工具: 现代浏览器(如Chrome、Firefox、Safari等&#…...

【数据结构】手撕单链表
目录 一,链表的概念及结构 二,接口实现 1,单链表的创建 2,接口函数 3,动态创立新结点 4,打印 5,头插 6,头删 7,尾插 8,尾删 9,查找 10ÿ…...

两个git本地如何配置两个ssh密钥for mac
我是在mac上操作的。windows上也差不多一样操作。 1.找到本地的.ssh文件。我的文件结构如下如: 文件结构: (1)两个known_hosts文件是自动生成的,不用管 (2)readme文件是我个人记事本记录笔记…...

iOS逆向进阶:iOS进程间通信方案深入探究与local socket介绍
在移动应用开发中,进程间通信(Inter-Process Communication,IPC)是一项至关重要的技术,用于不同应用之间的协作和数据共享。在iOS生态系统中,进程和线程是基本的概念,而进程间通信方案则为应用的…...

qt day 1
this->setWindowIcon(QIcon("D:\\zhuomian\\wodepeizhenshi.png"));//設置窗口的iconthis->setWindowTitle("鵬哥快聊");//更改名字this->setFixedSize(500,400);//設置尺寸QLabel *qlnew QLabel(this);//創建一個標簽ql->resize(QSize(500,20…...
针对java中list.parallelStream()的多线程数据安全问题我们采用什么方法最好呢?
当使用List.parallelStream()方法进行多线程处理时,可能会涉及到数据安全问题。下面是一些常见的方法来处理parallelStream()的多线程数据安全问题: 1. 使用线程安全的集合:Java中提供了线程安全的集合类,如CopyOnWriteArrayList…...

校园用电安全管理系统可以识别违规电器吗
校园用电安全管理系统是处理恶意用电问题有效手段之一,系统具有实时监测、异常预警、监测设备运行状态、远程控制用电等功能,可以从根本上管理学校用电量,制定合理的用电计划,限制用电成本,避免各种恶意用电行为&#…...

前端(十五)——开源一个用react封装的图片预览组件
👵博主:小猫娃来啦 👵文章核心:开源一个react封装的图片预览组件 文章目录 组件开源代码下载地址运行效果展示实现思路使用思路和api实现的功能数据和入口部分代码展示 组件开源代码下载地址 Gitee:点此跳转下载 CSDN…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...