线性表(1)

线性表即“把所有数据按照顺序(线性)的存储结构方式,存储在物理空间”。

线性表又分为

  • 顺序表
  • 链表
  1.  单向链表
  2. 双向链表

一、顺序表 

数据依次存储在连续的物理空间中,就比如数组。

顺序表存储数据时,会提前申请一整块足够大小的内存,然后将数据依次存储起来,元素的存储空间在内存中是连续存在的。

顺序表的优点:

  •  内存地址连续,数组元素进行遍历时,速度快。
  • 根据下标,查找指定位置的元素时,速度快。(时间复杂度为  O(1)  )

顺序表的缺点:

  • 长度固定,使用前需要预估长度。
  • 插入删除元素时,时间复杂度相对较高。(时间复杂度为  O(n)  )

二、链表 

与顺序表不同,链表不限制数据的物理存储位置,使用链表存储的数据元素,其物理存储位置是随机的。

链表中每个数据的存储都由以下两部分组成:

1G4212457-2.gif

  1. 数据元素本身,其所在的区域称为数据域;
  2. 指向直接后继元素的指针,所在的区域称为指针域

 链表的优点:

  • 使用链表结构,不需要提前预估长度,可以克服数组需要预先知道数据长度的缺点
  • 链表使用不连续的内存空间,可以充分利用计算机内存空间,实现灵活的内存动态管理

链表的缺点: 

  • 链表相比于数组会占用更多的空间,因为链表中每个节点中,除了存放元素本身,还有存放指向其他节点的指针
  • 不能随机读取元素(RandomAccess
  • 遍历和查找元素的速度比较慢

链表又分为:

  1. 单向链表
  2. 双向链表
  3. 循环链表
  4. 双向循环链表

(1)单向链表

1、单向链表的节点定义

//单向链表的节点定义
static class Node<E>{E item;//元素值Node<E> next;//后继节点(指针域)public Node(E data){this.item=data;}
}

2、链表的遍历 

//	链表的遍历@Overridepublic String toString() {StringJoiner sj=new StringJoiner("->");//从首元素开始遍历for(Node<E> n=first;n!=null;n=n.next) {sj.add(n.item.toString());}return sj.toString();}

3、头插法 

其主要思想为在原链表的头部添加一个新元素,我们只需要创建出一个新元素,然后让这个新元素的后继节点指向原来的头结点。

public class Linked<E>{//头节点Node<E> first;//尾节点Node<E> last;//添加新元素(头插法)public  void addfirst(E item){final Node<E> newfirst=new Node<E>(item);//创建出新的头节点final Node<E> f=first;//将原来的头节点存储起来first=newfirst;//将新创建的新的节点赋给头节点if(f==null) {last=newfirst;//如果这个链表为空时,它的头节点和尾节点都为所要添加的这个新节点}else {newfirst.next=f;//如果链表不为空,则新节点的后继节点指向原来的头节点}}
}

4、尾插法

其主要思想是在原链表的尾部添加一个节点,使得原来的尾节点的后继节点指向新添加的这个新节点

//	尾插法public void addlast(E item) {final Node<E> newlast=new Node<E>(item);final Node<E> l=last;//将原来的尾节点存储起来last=newlast;//将创建的新的节点赋给尾节点if(l==null) {first=newlast;}else {l.next=newlast;//如果链表不为空,则原尾结点的后继节点指向新节点}}

5、删除头结点

其主要思想是删除旧的头节点,再将旧的头节点的后继节点作为新的头节点

//	删除头结点public void delfirst() {final Node<E> f=first;//先保存头节点final Node<E> next=f.next;//拿到头节点的后继节点f.item=null;//删除旧的头节点f.next=null;first=next;//设置新的头节点if(next==null) {//单向链表为空,则尾结点为nulllast=null;}}

(2)循环链表

循环链表 其实是一种特殊的单链表,和单链表不同的是循环链表的尾结点不是指向 null,而是指向链表的头结点。

循环链表2.png

(3) 双向链表

双向链表.png

1、双向链表的节点类

static class Node<E>{E item;//数据域Node<E> prev;//前驱节点Node<E> next;//后继节点//		构造方法public Node(E element,Node<E> prev,Node<E> next) {this.item=element;this.next=next;this.prev=prev;}

2、双向链表的头插法 

双向链表在头插法时,其新加入的节点的前驱节点指向null,后继节点指向原来的头节点

    Node<E> first;Node<E> last;int size=0;public  void addfirst(E item) {final Node<E> f=first;final Node<E> newfirst=new Node<E>(item,null,f);first=newfirst;if(f==null) {last=newfirst;}else {newfirst.next=f;}size++;}

3、双向链表的尾插法

双向链表的尾插法,其新加入的节点前驱节点指向原尾结点,后继节点指向null

public void addlast(E item) {final Node<E> l=last;final Node<E> newlast=new Node<E>(item,l,null);last=newlast;if(l==null) {first=newlast;}else {l.next=newlast;}size++;}

4、删除头节点 

// 删除链表头节点
public void removeFirst() {// 获取头结点final Node<E> f = first;// 获取头结点的下一个节点final Node<E> next = f.next;// 清空头结点f.item = null;f.next = null; // help GC// 设置链表的头结点first = next;if (next == null)last = null;elsenext.prev = null;// 链表长度自减size--;
}

 

5、 删除尾结点

// 删除链表尾节点
public void removeLast() {// 获取尾节点final Node<E> l = last;// 获取尾节点的“上一个元素”final Node<E> prev = l.prev;// 清空尾节点l.item = null;l.prev = null; // help GC// 设置链表的尾节点last = prev;if (prev == null)first = null;elseprev.next = null;// 链表长度自减size--;
}

(4)双向循环链表

双向循环链表 最后一个节点的 next 指向 head,而 head 的 prev 指向最后一个节点,构成一个环。

双向循环链表.png

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

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

相关文章

树莓派上使用kettle将文本文档导入mariadb

目录 1 连接MariaDB的前置条件 2 test.txt 3 在mariadb中创建数据库和数据表 4 在kettle中的操作 4.1 新建任务 4.2 连接数据库 4.3 文本文件输入 4.4 表输出 4.5 运行 4.6 结果 1 连接MariaDB的前置条件 首先你的mariaDB要有密码&#xff0c;我当前的用…

uview的真机演示,微信小程序,当两个input框的时候,从一个input切换到两一个input的时候,键盘调不起来

项目场景&#xff1a; 项目相关背景&#xff1a; 例如&#xff1a;uview的真机演示&#xff0c;微信小程序&#xff0c;当两个input框的时候&#xff0c;从一个input切换到两一个input的时候&#xff0c;键盘调不起来 问题描述 遇到的问题&#xff1a; 例如&#xff1a;切…

MQ - 32 基础功能:消息查询的设计

文章目录 导图概述什么时候会用到消息查询消息队列支持查询的理论基础消息数据存储结构关于索引的一些知识点内核支持简单查询根据 Offset 查询数据根据时间戳查询数据根据消息 ID 查询数据借助第三方工具实现复杂查询第三方引擎支持查询工具化简单查询总结导图 概述 从功能上…

智慧农业系统源码 智慧农业小程序源码

智慧农业系统源码 智慧农业小程序源码 一&#xff1a;智慧农业功能 1、有效改善农业生态环境 将农田、畜牧养殖场、水产养殖基地等生产单位和周边的生态环境视为整体,并通过对其物质交换和能量循环关系进行系 统、精密运算,保障农业生产的生态环境在可承受范围内,如定量施肥不…

【前端】零基础快速搞定JavaScript核心知识点

文章目录 1.初识JavaScript1.1.JavaScript语言简介1.2.JavaScript引入方式和注释1.3.Javascript变量声明详解1.4.JavaScript变量提升详解 2.JavaScript基础数据类型2.1.JavaScript基础数据类型简介2.2.基础类型数据-Number2.3.基础类型数据-String2.4.基础类型数据-Boolean2.5.…

使用applescript自动化trilium的数学公式环境(二)

9.23 ver1 没想到今天很有精神&#xff0c;在玩chatgpt的时候突然想到&#xff0c;为什么不让他帮我写一份代码呢&#xff1f;说干就干。但是&#xff0c;可能是因为我的英语不怎么样&#xff0c;chatgpt生成出来的整个东西实在是菜的抠脚。所以我觉得还是应该自己先想好一个大…

javaee之黑马乐优商城6

商品品牌的查询 上面就是我们需要根据分类id去找品牌 假设我们现在拿到的是 商品的分类id&#xff0c;我们需要根据分类id查询出对应的品牌即可 下面我们拿到上面的接口&#xff0c;直接撸代码 这个是和品牌相关联的操作&#xff0c;因为先去看一下BrandMapper,这个mapper是…

Vue3 动态组件 component:is= 失效

错误代码 用Vue3&#xff0c;组件无需注册&#xff0c;所以就会提示“注册了不不使用”的报错&#xff0c; 于是用了异步注册&#xff0c;甚至直接为了不报错就在下面使用3个组件&#xff0c;有异步加载&#xff0c;但还是实现不了预期效果 <script setup> import { re…

Linux内核启动流程-第二阶段rest_init函数

一. Linux内核启动 上一篇文章简单了解了 Linux内核启动第二阶段&#xff0c;涉及的 start_kernel函数。start_kernel 函数最后调用了 rest_init 函数&#xff0c;接下来简单看一下 rest_init 函数。 本文续上一篇文章的学习&#xff0c;地址如下&#xff1a; Linux内核启…

距离矢量路由协议RIP(含Cisco模拟器实验命令配置)

距离矢量路由协议RIP(含Cisco模拟器实验命令配置) 简介 距离矢量路由协议&#xff08;Routing Information Protocol, RIP&#xff09;是一种内部网关协议&#xff0c;它位于应用层&#xff0c;使用520 UDP端口。RIP基于距离矢量算法&#xff08;Bellham-Ford&#xff09;根据…

Ubuntu Kafka开机自启动服务

1、创建service文件 在/lib/systemd/system目录下创建kafka.service文件 [Unit] DescriptionApache Kafka Server Documentationhttp://kafka.apache.org/documentation.html Requireszookeeper.service[Service] Typesimple Environment"JAVA_HOME/usr/local/programs/j…

MSF的安装与使用教程,超详细,附安装包和密钥

MSF简介 Metasploit&#xff08;MSF&#xff09;是一个免费的、可下载的框架 它本身附带数百个已知软件漏洞&#xff0c;是一款专业级漏洞攻击工具。 当H.D. Moore在2003年发布Metasploit时&#xff0c;计算机安全状况也被永久性地改变了&#xff0c;仿佛一夜之间&#xff0…

MySQL进阶篇4——锁+InnoDB引擎+MySQL管理

锁 概述 保证并发访问数据库数据的一致性和有效性等。 全局锁-库锁 ​ 加锁后&#xff0c;整个数据库实例就处于只读状态&#xff0c;后续的DML语句&#xff0c;DDL语句&#xff0c;以及更新操作的事务提交语句都将会被阻塞。 典型使用场景&#xff1a; ​ 对全库做逻辑备…

PY32F003F18之DMA串口

PY32F003F18使用DMA串口&#xff0c;官方程序省FLASH&#xff0c;但不省内存。单片机内存够大&#xff0c;节省没意义&#xff0c;故做了修改&#xff0c;少用HAL库中的发送和接收&#xff0c;从里面抠出有用的部分&#xff0c;修修改改就可以了。 一、DMA串口初始化流程&…

人生第一个java项目 学生管理系统

开始编程 建类 开始主要部分 main()部分 方法部分

RocketMQ —消费进度管理

Apache RocketMQ 通过消费位点管理消费进度&#xff0c;本文为您介绍 Apache RocketMQ 的消费进度管理机制。 背景信息​ Apache RocketMQ 的生产者和消费者在进行消息收发时&#xff0c;必然会涉及以下场景&#xff0c;消息先生产后订阅或先订阅后生产。这两种场景下&#x…

【单调栈】496. 下一个更大元素 I

496. 下一个更大元素 I 解题思路 首先计算nums2的每一个元素的下一个比他大的元素&#xff0c;使用单调栈将上面的结果和nums2中的每一个元素组成映射map针对每一个Nums1的元素 查询map 记录map 的value class Solution {public int[] nextGreaterElement(int[] nums1, int[…

算法 N皇后问题-(递归回溯)

牛客网 BM59. 解题思路&#xff1a; 行列、斜叉不在一条直线上。 命令行为 row, 列为col, row 从0开始递归直到最后一行&#xff0c;列从0开始遍历&#xff0c;直到最后一列&#xff0c;中间每一步记录或清除位置状态&#xff0c;状态分为 m1[col] 1, m2[row-col] 1, m3[r…

R语言柱状图直方图 histogram

柱状图简介 柱状图也叫直方图&#xff0c;是展示连续性数值的分布状况。在x轴上将连续型数值分为一定数量的组&#xff0c;y轴显示对应值的频数。 R基本的柱状图 hist 我们用R自带的Orange数据来画图。 > head(Orange)Tree age circumference(圆周长) 1 1 118 …

国家开放大学的训练试题

仓储与配送管理 参考 试题 一、单项选择题&#xff08;每小题2分&#xff0c;共20分&#xff0c;将正确答案选项的字母填入题目的括号内&#xff09; 1.( )是保管人在接受仓储物后签发的表明一定数量的保管物已经交付仓储保管的法律文书。 A.保单 B.仓单 C.提单 D.发票 …