数据结构之线性表 顺序表 链表

ChatGPT高效制作PPT:从内容生成到设计优化全流程 人工智能技术正在改变传统办公文档的创作方式,其中自然语言处理(NLP)与生成式AI的结合为内容创作带来了革命性突破。以ChatGPT为代表的大语言模型(LLM)能够理解复杂指令并生成结构化内容,其核心原理是通过海量数据训练获得的语义理解和文本生成能力。在办公自动化场景中,这种技术特别适合解决PPT制作中的两大痛点:内容创作耗时和逻辑架构困难。通过精心设计的提示词工程,AI可以快速输出包含核心要点、数据支撑的完整内容框架,甚至直接生成Markdown格式的代码以便快速转换为PPT。对于商业计划、项目汇报等高频 阅读详情

1.线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结

构,常见的线性表:顺序表、链表、栈、队列、字符串...

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物

理上存储时,通常以数组和链式结构的形式存储。

2.顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组

上完成数据的增删查改。

顺序表一般可以分为:

1. 静态顺序表:使用定长数组存储。

2. 动态顺序表:使用动态开辟的数组存储。

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多

了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下

面我们实现动态顺序表。

学习顺序表接口时,不能只看代码地实现,最主要的是接口增,删,查,改时所对应的逻辑结构图,一定要将所对应的图以及步骤理解清楚,代码中size的代表,为什么要扩容,这都是很重要的问题。

下面来看代码:

// 顺序表的元素类型 int
public class MyArrayList {
	// 属性是什么
	private int[] array;		// 代表的是存在数据的数组
								// array.length 代表的是数组的容量
	private int size;			// 记录顺序表的已有数据个数
	
	// 构造方法
	public MyArrayList() {
		// 1. 申请空间
		array = new int[2];
		// 2. 初始化数据个数
		size = 0;
	}
	
	// 增(重点)
	// 平均 O(1)
	public void pushBack(int element) {
		ensureCapacity();
		array[size++] = element;
	}
	
	public void pushFront(int element) {
		ensureCapacity();
		for (int i = size; i >= 1; i--) {
			array[i]  = array[i - 1];
		}
		
		array[0] = element;
		size++;
	}
	
	public void insert(int index, int element) {
		if (index < 0 || index > size) {
			System.err.println("下标错误");
			return;
		}
		
		ensureCapacity();
		
		for (int i = size - 1; i >= index; i--) {
			array[i + 1] = array[i];
		}
		array[index] = element;
		size++;
	}
	
	// 删(重点)
	public void popBack() {
		if (size <= 0) {
			System.err.println("顺序表为空");
			return;
		}
		array[--size] = 0;
	}
	
	public void popFront() {
		if (size <= 0) {
			System.err.println("顺序表为空");
			return;
		}
		
		for (int i = 0; i < size - 1; i++) {
			array[i] = array[i + 1];
		}
		
		array[--size] = 0;
	}
	
	public void earse(int index) {
		if (size <= 0) {
			System.err.println("顺序表为空");
			return;
		}
		
		if (index < 0 || index >= size) {
			System.err.println("下标错误");
			return;
		}
		
		for (int i = index + 1; i < size; i++) {
			array[i - 1] = array[i];
		}
		
		array[--size] = 0;
	}
	
	// 查
	// 改
	// 打印
	public void print() {
		System.out.println("打印顺序表: 当前容量: " + array.length);
		for (int i = 0; i < size; i++) {
			System.out.print(array[i] + " ");
		}
		System.out.println();
	}
	
	// 保证容量够用,否则进行扩容
	private void ensureCapacity() {
		if (size < array.length) {
			return;
		}
		
		int newCapacity = array.length * 2;
		int[] newArray = new int[newCapacity];
		for (int i = 0; i < size; i++) {
			newArray[i] = array[i];
		}
		array = newArray;
	}
	
	public static void main(String[] args) {
		MyArrayList list = new MyArrayList();
		list.print();
		list.pushBack(1);
		list.pushBack(2);
		list.pushBack(3);
		list.print();	// 1 2 3
		list.pushFront(10);
		list.pushFront(20);
		list.pushFront(30);
		list.print();	// 30 20 10 1 2 3
		list.insert(3, 100);
		list.print();	// 30 20 10 100 1 2 3
		list.insert(20, 200);	// 报错
		
		list.earse(2);
		list.earse(2);
		list.print();	// 30 20 1 2 3
		list.popFront();
		list.popFront();
		list.popFront();
		list.print();	// 2 3
		list.popBack();
		list.popBack();
		list.print();	// 空的
		list.popBack();	// 报错
	}
}







3.链表

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的引用链

接次序实现的 。

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

1. 单向、双向

2. 带头、不带头

3. 循环、非循环

虽然链表的类型很多,我们还是把它分为了三种:

1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结

构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。

2. 带头循环单链表:结构较无头单向非循环链表简单。实际操作当中使用较少。

3. 不带头双向循环链表:在Java的集合框架库中LinkedList底层实现就是不带头双向循环链表。

链表的实现应该注意结点和引用的问题,搞清head以及node包括后面的.next可以帮助我们清晰理解链表。

下面是代码:

// 前驱 prev	previous
// 后继 next
class Node {
	int val;	// data | element
	Node next;	// 如果 next == null 表示是最后一个结点

	Node(int val) {
		this.val = val;
		this.next = null;
	}
	
	public String toString() {
		return String.format("Node(%d)", val);
	}
}

 
public class MyLinkedList {
	public static void main(String[] args) {
		Node head = null;
		// head 的意思是链表的第一个结点
		// 通过第一个结点,就可以找到完整的链表的所有结点
		// 所以,链表的第一个结点往往代表整个链表
		
		// 空的链表,就是一个结点都没有的链表
		// 也就没有第一个结点
		// head == null 表示第一个结点不存在
		// 也就是整个链表为空
		
		
		
		// 头插
		/*
		int val = 0;
		// 1. 结点
		Node node = new Node(val);
		// 2. 让原来的 head 成为 node 的下一个结点
		node.next = head;
		// 3. 更新第一个结点的引用
		head = node;
		
		pushFront(head, 0);
		*/
		
		head = pushFront(head, 0);
		head = pushFront(head, 1);
		head = pushFront(head, 2);
		
		// 打印
		print(head);	// 2 1 0
		
		// 尾插
		head = popFront(head);
		print(head);	// 1 0
		
		head = pushBack(head, 10);
		head = pushBack(head, 20);
		head = pushBack(head, 30);
		print(head);	// 1 0 10 20 30
		head = popBack(head);
		head = popBack(head);
		head = popBack(head);
		head = popBack(head);
		head = popBack(head);
		
		head = popBack(head);	// 报错
		print(head);		// 空
		
		head = pushBack(head, 100);
		print(head);		// 100
	}
	
	// 打印
	private static void print(Node head) {
		System.out.println("打印链表:");
		for (Node cur = head; cur != null; cur = cur.next) {
			System.out.print(cur + " --> ");
		}
		System.out.println("null");
	}
	
	// 头插
	// head: 原来的第一个结点
	// val:要插入的值
	// 返回:新的第一个结点
	private static Node pushFront(Node head, int val) {
		// 1. 结点
		Node node = new Node(val);
		// 2. 让原来的 head 成为 node 的下一个结点
		node.next = head;
		// 3. 更新第一个结点的引用
		return node;
	}
	
	private static Node pushBack(Node head, int val) {
		Node node = new Node(val);
		if (head == null) {
			return node;
		} else {
			Node last = head;
			while (last.next != null) {
				last = last.next;
			}
			last.next = node;
			
			return head;
		}
	}
	
	private static Node popFront(Node head) {
		if (head == null) {
			System.err.println("空链表无法删除");
			return null;
		}
		
		// 原来第一个结点,会因为没有引用指向而被回收
		return head.next;
	}
	
	private static Node popBack(Node head) {
		if (head == null) {
			System.err.println("空链表无法删除");
			return null;
		}
		
		if (head.next == null) {
			return null;
		} else {
			Node lastSecond = head;
			while (lastSecond.next.next != null) {
				lastSecond = lastSecond.next;
			}
			
			lastSecond.next = null;
			return head;
		}
	}
}








线性表在数据结构中比较抽象,希望大家能够慢慢去理解,用画图的方式为自己加深印象,慢慢去体育代码的实行过程,从中找出自己的学习方式。

 

 

 

 

 

 

 

嵌入式软件工程师面试题目整理(一) 文章目录嵌入式软件工程师面试题目整理(一)Arm有多少32位寄存器?Arm2440和6410有什么区别CPU,MPU,MCU,SOC,SOPC联系与差别上拉&下拉&高阻态串口协议讲一讲RS232和RS485通讯接口有什么区别IIC时序图画一下,IIC有哪些状态,给一个字节,将它发送出去。IIC有什么注意事项?有没有用I/O模拟IIC,如果有需要注意什么?为什么2440的内存起始地址是3后面7个0呢?为什么6410的内存起始地址是5后面7个0呢?内存管理有什么看法?(MMU)锁有哪些?有什么注 阅读详情

相关推荐

论文地图合规求生指南:5分钟搞定标准地图服务转ArcGIS可用矢量文件

本文提供了一份论文地图合规求生指南,帮助非GIS专业背景的科研人员在5分钟内将标准地图服务的EPS文件转换为ArcGIS兼容的矢量文件。通过详细的工作流程和关键参数设置,确保地图完全符合国家规范,同时节省时间成本。重点关注标准地图服务的合规性和Shapefile转换技巧,适用于紧急情况下的论文地图处理。

weixin_34233974的博客 402

全网最详细线性表讲解(顺序表,链表)

有关数据结构中顺序表、链表的知识(C语言讲解)

陈某的博客 1559

计算机毕业设计springboot基于微信平台的二次元手办商场小程序【附源码】

选题背景: 随着二次元文化的兴起和普及,越来越多的人开始对二次元角色产生了浓厚的兴趣和喜爱。手办作为二次元文化的重要载体之一,成为了许多二次元爱好者收藏和展示的对象。然而,在传统的线下手办商场中,消费者往往面临着时间、空间和选择的限制。因此,基于微信平台的二次元手办商场小程序应运而生。 选题意义: 首先,基于微信平台的二次元手办商场小程序能够打破地域限制,使得用户可以随时随地通过手机进行购物。无论是在家中、上班途中还是旅行中,用户都能够方便地浏览和购买自己喜欢的手办,极大地提高了购物的便利性和灵活性。

拉期程序 450

【数据结构篇】线性表1 --- 顺序表、链表 (万字详解!!)

前言:这篇博客我们重点讲线性表中的顺序表、链表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

iiiiiihuang的博客 3229

华为HCIA-Datacom实战:200人企业园区网从规划到部署全流程解析

本文详细解析了华为HCIA-Datacom认证实战中200人企业园区网的规划与部署全流程。从需求分析、组网架构设计到设备选型、VLAN划分及安全策略实施,全面覆盖园区网建设的关键环节,特别针对部门隔离、无线覆盖和基础安全防护等典型场景提供可落地的解决方案。

f0g1h2的博客 710

SpringBoot文件上传实战:MultipartFile重复读取的3种方法(附避坑指南)

本文详细介绍了SpringBoot中处理MultipartFile重复读取的3种实用方法,包括字节数组缓存法、临时文件法和流重置法,并提供了避坑指南和性能优化技巧。特别适合需要多次读取上传文件内容的开发者,帮助解决InputStream流只能读取一次的问题。

weixin_28710999的博客 398

数据结构_线性表、顺序表、单链表

因为我们不清楚给定元素之前的结点情况,也可以说链表的指针都是指向下一个结点的,因此我们可以通过引入头结点的方法,对整个链表进行遍历,那么整个链表的内容就会一览无余。从一个空表(头指针为NULL时)开始,生成新结点,并且将读取到的数据存放到新结点的数据域中,将新结点插入到当前链表的表头(头结点之后)。不管带不带头结点,头指针始终指向链表的第一个结点,而头结点是带有头结点的链表中的第一个结点,结点内通常不存储信息。的情况,那么在第i个位置上插入需要找到第 i-1 个结点,将新结点插在其后。

light_2025的博客 1924

数字电视中的AD(Audio Description)音频描述技术详解

AD(Audio Description)音频描述是一种辅助技术,旨在帮助视障人士更好地理解视觉内容。通过在节目或视频的自然停顿处插入额外的语音叙述来解释屏幕上的视觉信息,如人物动作、场景变化、文字说明等,从而让视力受损的人士也能获得完整的观影体验。AD服务不仅限于电视广播,也广泛应用于电影、剧院表演、在线视频平台等领域。PID:用于标识和区分不同的音频流。PMT表:提供每个音频流的详细信息,包括PID、编解码器类型和语言代码。时间戳:PTS和DTS用于同步音频与视频内容。解复用。

以实战经验介绍行业知识 739

数据结构--线性表--顺序表和链表

不带头单向不循环链表只适合头插、头删,进行其他的操作效率都不高不带头单向不循环链表只有一个next,所以要注意不带头单向不循环链表的相交不可能是一个X型,两个不带头单向不循环链表相交一定是Y型。

kk6kk的博客 550

基于知识图谱的农作物病虫害问答系统设计与实现

基于规则的问题分类是自问答系统诞生以来就一直存在的方式,主要代表就是众多的专家系统,构建专家系统采用的是规则分类器,优点是能够对特定领域、特征明显的问题进行高效精准问答,但是。,在问答系统中,问题以语音及文本字符等自然语言形式输入,利用问答系统的内部的逻辑处理模块,通过自然语言处理技术获得输入问句的详细语义信息,再经过知识检索、置信分析等步骤,自然语言处理中,用于文本分类任务的机器学习方式有两种,一种用传统的机器学习,如 NBC、SVM 等,另一种采用深度学习,如 CNN 和 RNN 等。

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2165

《计算机视觉:从入门到精通》技术手册 第1章 计算机视觉概述与历史演进

视觉感知与机器视觉在工程实践中常被混用,但二者存在本质差异。视觉感知强调对光学信号的语义理解与场景解释,核心在于从二维投影重建三维世界的物理与语义属性。该领域关注遮挡处理、光照变化、材质反射等复杂因素的建模,其目标是实现类似人类视觉系统的场景理解能力。机器视觉则侧重于工业场景中的精密测量与控制,通常基于结构化光源、已知几何约束与标定参数,执行边缘检测、尺寸测量、位置定位等任务。前者面向开放环境的通用理解,后者面向受控环境的精确执行。

u012133341的博客 269

线性表——顺序表和链表

顺序表和链表的解释与实现

qq_65285898的博客 3819

手把手教你学Simulink——基于Simulink的模糊自适应PI调节FOC电流环

本文提出基于模糊自适应PI控制的FOC电流环优化方案,针对传统PI控制参数固化、抗扰性差等问题,通过模糊逻辑在线调整PI参数。方案采用双输入(电流误差及变化率)和三输出(ΔKp/ΔKi/PI调节)结构,实现动态响应时间<30μs(提升38%)、超调<5%(降低71%)、参数摄动下误差<±0.4A(精度提升73%)。详细介绍了Simulink建模步骤,包括模糊规则设计(7语言变量、49条规则)、隶属度函数配置及自适应PI实现逻辑,并提供实机部署建议。仿真结果表明,该方法显著提升系统鲁棒性,特

MHD0815的博客 79

【数据结构与算法】之线性表:顺序表和链表个人总结

定义:线性表是具有相同特性的数据元素的一个有限序列。特点:各个数据元素之间是线性关系。在非空的线性表中,有且仅有一个开始结点,它没有直接前趋,而仅有一个直接后继。有且仅有一个终端结点,它没有直接后继,而仅有一个直接前趋。其余内部结点都有且仅有一个直接前趋和一个直接后继。

2201_75455144的博客 2190

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【数据结构篇C++实现】- 线性表 - 顺序表和链表

线性表知识总结,一文搞懂什么是顺序表与链表,以及常见的操作

陈七的博客,学习知识分享,期待与大家的交流 4258

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数据结构线性表之顺序表与链表

本文主要介绍数据结构、线性表以及线性表下的顺序表与链表的基本概念以及相关代码(C语言版)。附加顺序表与链表在线OJ习题的练习。

fjhugjkdsd的博客 1018

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数据结构线性表——顺序表、链表

1.线性表 线性表(linear list)是有n个相同特性的元素组成的有限序列,在逻辑上是线性结构,也就是连续的一条直线;但是在物理结构上,不一定是连续的。 常见的线性表有: 顺序表、链表、栈、队列、字符串.... 2.顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的数据结构,一般采用数组存储,在数组上完成增删查改。 顺序表一般分为: 1.静态的顺序表:使用定长数组存储元素。 define N 6 typedef int SeqListDataType; t.

qq_64105689的博客 807

数据结构之【线性表】(顺序表、链表的基本操作实现)

概念 线性表:是N个数据元素的有限序列。 顺序表:用一组地址连续的存储单元依次存储【线性表 】的数据元素。(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储【线性表】的数据元素。 顺序表的声明: 0、顺序表的声明 顺序表的基本操作: 1、初始化顺序表L 2、销毁顺序表L 3、创建顺序表 4、清空顺序表 5、判断顺序表是否为空 6、求顺序表的长度 7、获取第i个数据元素的值 8、定位某元素e的位置 9、求当前元素的直接前驱元素 10、求当前元素的直接后继元素 11、向顺

不动声色的小蜗牛的博客 3775

【数据结构】线性表完全指南:顺序表与链表详解

线性表指的是具有相同数据类型的n(n>=0)个数的有限序列。假设a1是第一个数据元素,称为表头元素;an是最后一个数据元素,称为表尾元素;ai(1<i<n)是第i个数据元素:则a1有且只有一个后继;an有且只有一个前驱;ai有且只有一个前驱和一个后继。线性表是一种逻辑结构,定义了一组元素之间“一个接一个”的前后关系。根据这个结构在计算机内存中的存储方式:我们分为顺序存储结构和链式存储结构。顺序表适合查询多、修改少的场景。链表适合频繁插入删除、动态性强的场景。

weixin_45467593的博客 1438

数据结构——线性表:顺序表、单向链表、循环链表、双向链表

线性表 是一种数据结构:n个数据元素的有限序列 表示形式: L = (a1,a2...an) a1是线性表的元素,小写。 n=0时候为空表 数据元素具有相同特性 相邻元素之间存在序偶关系:即有唯一的第一和最后一个元素,除了第一个元素外,每个元素有且只有一个前驱,除最后一个元素外,有且只有一个后继。 定义数据类型构成list: 怎么具体实现 存储结构:顺序、链式...

tyfwin的博客 1379

数据结构——线性表(顺序表、链表)

目录数据结构线性表(顺序表、链表)顺序表链表无头单向非循环链表带头双向循环链表顺序表和链表的优缺点 数据结构线性表(顺序表、链表) 今天来给大家介绍一下数据结构线性表里的顺序表和链表。 数据结构:数据结构是数据与数据之间的存储关系。 线性表:线性表是n个具有相同特性的数据元素的有限序列。常见的线性表有:顺序表、链表、栈、队列、字符串等。 线性表在逻辑上是线性结构,但是在物理上不一定连续。它在存储时通常以数组和链式结构的形式存储。 顺序表 概念:顺序表是用一段物理地址连续的存储单元依次存储元素的线性结构,一般

m0_46859476的博客 537

python 数据结构之线性表---顺序表、链表

线性表是一种简单的数据结构,按照其储存方式,分为顺序表和链表。 顺序表和链表的特点如下: 顺序表的操作 顺序表 L 的基本操作为: clear(L) 置空 length(L) 求表中元素的个数 insert(L,i,x) 插入新元素 delete(L,x 删除已有元素 empty(L) 判断表是否为空 index(L,x) 返回指定元素在表中的位置 pop(i)...

weixin_45459565的博客 904

Java数据结构与算法_线性表_顺序表与链表

Java数据结构与算法_线性表_顺序表与链表

weixin_63736489的博客 678

数据结构深度解析:从顺序表到静态链表,一文读懂所有线性表

本文系统介绍了六种经典线性数据结构:顺序表(静态数组,随机访问高效但容量固定)、不定长顺序表(动态数组,可扩容)、单链表(动态内存节点,插入删除高效)、循环链表(首尾相连的单链表)、双向链表(双指针节点支持双向遍历)和静态链表(数组模拟链表)。通过对比表格和C++代码示例,分析了各结构的特性(存储密度、时间复杂度等)及适用场景(如频繁随机访问选顺序表,频繁插入删除选链表)。文章强调理解这些基础结构对编程的重要性,建议根据具体需求(访问模式、内存限制等)选择最合适的实现方式。

2301_78884150的博客 876

【数据结构】线性表部分习题2(顺序表与链表)

数据结构——线性表部分习题2.(顺序表与链表)持续更新中!!!

ChenZHIHAO_y的博客 1738

【数据结构】线性表 _顺序表 &链表的增删查改 _[细节分析+代码实现]

我们实现的链表存储的数据是int类型,所以对int进行重命名,如果存储的数据不是int类型,把int改成其他的类型即可。当容量为100时,满了之后扩容为200,但是我们只需要再插入5个数据,后面就没有数据插入了,就浪费了95个数据空间。我们在这里主要学习的是带头双向循环链表,虽然它看起来复杂,但是实现起来并不复杂,而且相比于其他类型有很大的优势。还有一个需要去注意的点是pos是数组下标,是有范围的,一定要注意数组的越界问题。如果传的是结构体,那么形参是实参的一份临时拷贝,形参的改变不会影响实参。

qq_63179783的博客 1742
上一篇: 数据结构 链表
下一篇: 数据结构之多个链表问题
王翔乐
博客等级 码龄8年 6粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值