数据结构-Java逆天操作

本文章会对Java线性表的相关知识进行讲解,也会以Java代码示例来进行解释

对线性表的讲解分析

在这里插入图片描述

定义

线性表是一种数据结构,它是由一系列具有相同类型的元素组成的有序集合。线性表中的元素按照线性的顺序
排列,每个元素只有一个前驱元素和一个后继元素,除了第一个元素没有前驱元素,最后一个元素没有后继
元素。

在这里插入图片描述

可以表示为

表中的元素序列{x1,x2,...,xn},其中xi是表中的元素,它们具有相同的数据类型,n表示表中元素的个数。
线性表满足以下特性:元素的有序性:线性表中的元素按照线性的顺序排列,每个元素都有一个确定的位置。有限性:线性表中的元素个数是有限的。相同数据类型:线性表中的元素具有相同的数据类型,即它们具有相同的属性和操作。

线性表可以用多种方式来表示和实现,常见的实现方式包括顺序表和链表两种。

在这里插入图片描述

顺序表

是一种基于数组的实现方式,元素在内存中连续存储,通过下标访问元素,插入和删除操作需要移动其他元素。

链表

是一种通过节点之间的指针来连接的实现方式,节点包含元素和指向下一个节点的指针,可以实现高效的插入
和删除操作,但访问元素的效率相对较低。

在这里插入图片描述

注意

线性表作为数据结构中的基本概念,广泛应用于各个领域的算法和程序设计中。掌握线性表的定义和实现方式,
能够帮助我们更好地理解和应用其他数据结构和算法。线性表是一种常见的数据结构,它由一系列元素组成,这些元素之间存在着一对一的前后关系。线性表中的元
素可以是任何类型的数据,如整数、字符或对象等。线性表中的元素排列有序,每个元素都有一个直接前驱元素和一个直接后继元素,除了第一个元素没有前驱元
素,最后一个元素没有后继元素。线性表的访问方式可以根据元素在表中的位置进行操作,如按索引访问、插入、删除等。其中,按索引访问是
通过元素在表中的位置(索引)来获取对应的元素值。插入和删除可以在指定的位置上插入新的元素或者移除
现有的元素。线性表有很多种实现方式,常见的包括数组和链表。数组作为一种静态数据结构,需要提前声明一个固定大小
的空间来存储元素,操作灵活性较差。链表则以节点的形式存储元素,每个节点包含了数据及指向下一个节点
的指针,操作相对灵活,但涉及到频繁的内存分配和释放。线性表常用的算法包括遍历、查找和排序等。遍历操作用于依次访问线性表中的所有元素。查找操作可以根据
某个条件查找满足要求的元素,常见的方法有线性查找和二分查找。排序操作可以将线性表中的元素按照一定
的规则进行排列,常见的排序算法有冒泡排序、插入排序和快速排序等。总之,线性表是一种简单、常用的数据结构,能够有效地组织和处理大量的数据,广泛应用于各个领域的算法
与程序设计中。

在这里插入图片描述

代码实现

在Java中,我们可以使用数组或链表来实现线性表。

使用数组实现线性表:

public class ArrayList {private int size;private Object[] array;public ArrayList() {this.size = 0;this.array = new Object[10]; // 初始化数组大小为10}public void add(Object item) {if (size == array.length) {Object[] newArray = new Object[array.length * 2]; // 当数组容量不足时,扩大数组System.arraycopy(array, 0, newArray, 0, size); // 将原数组中的元素复制到新数组array = newArray;}array[size++] = item;}public Object get(int index) {if (index >= 0 && index < size) {return array[index];} else {throw new IndexOutOfBoundsException();}}public int size() {return size;}
}

在这里插入图片描述

在Java语言中,我们可以使用数组来实现线性表的增删改查操作线性表的例子:
public class MyArrayList {private Object[] array;private int size;private int capacity;public MyArrayList() {capacity = 10; // 初始化容量为10array = new Object[capacity];size = 0;}public int getSize() {return size;}public boolean isEmpty() {return size == 0;}public void add(Object element) {if (size == capacity) {increaseCapacity(); // 扩容}array[size] = element;size++;}public void remove(int index) {if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index out of range");}for (int i = index; i < size - 1; i++) {array[i] = array[i + 1];}array[size - 1] = null;size--;}public void set(int index, Object element) {if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index out of range");}array[index] = element;}public Object get(int index) {if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index out of range");}return array[index];}public boolean contains(Object element) {for (int i = 0; i < size; i++) {if (array[i].equals(element)) {return true;}}return false;}private void increaseCapacity() {capacity *= 2; // 扩大两倍Object[] newArray = new Object[capacity];for (int i = 0; i < size; i++) {newArray[i] = array[i];}array = newArray;}
}
使用示例:public class Main {public static void main(String[] args) {MyArrayList list = new MyArrayList();list.add("A");list.add("B");list.add("C");System.out.println("Size: " + list.getSize()); // 输出:Size: 3list.remove(1); // 删除索引为1的元素System.out.println("Size: " + list.getSize()); // 输出:Size: 2list.set(0, "D"); // 将索引为0的元素设置为"D"System.out.println(list.get(0)); // 输出:DSystem.out.println(list.contains("C")); // 输出:false}
}

在这里插入图片描述

使用链表实现线性表:

public class LinkedList {private Node head;private int size;private class Node { // 链表节点类Object data;Node next;public Node(Object data) {this.data = data;this.next = null;}}public LinkedList() {this.head = null;this.size = 0;}public void add(Object item) {Node newNode = new Node(item);if (head == null) {head = newNode;} else {Node current = head;while (current.next != null) {current = current.next;}current.next = newNode;}size++;}public Object get(int index) {if (index >= 0 && index < size) {Node current = head;for (int i = 0; i < index; i++) {current = current.next;}return current.data;} else {throw new IndexOutOfBoundsException();}}public int size() {return size;}
}
在Java语言中,我们用链表来实现线性表的增删改查操作线性表的例子:
代码演示了使用链表实现线性表的增加、删除、修改和查询操作,并使用
MyLinkedList类来实现这些功能。你可以根据需要进一步扩展和优化这个实现。
public class ListNode {Object data;ListNode next;public ListNode(Object data) {this.data = data;this.next = null;}
}public class MyLinkedList {private ListNode head;private int size;public MyLinkedList() {head = null;size = 0;}public int getSize() {return size;}public boolean isEmpty() {return size == 0;}public void add(Object element) {ListNode newNode = new ListNode(element);if (head == null) {head = newNode;} else {ListNode current = head;while (current.next != null) {current = current.next;}current.next = newNode;}size++;}public void remove(int index) {if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index out of range");}if (index == 0) {head = head.next;} else {ListNode previous = getNode(index - 1);ListNode current = previous.next;previous.next = current.next;}size--;}public void set(int index, Object element) {if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index out of range");}ListNode node = getNode(index);node.data = element;}public Object get(int index) {if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index out of range");}ListNode node = getNode(index);return node.data;}public boolean contains(Object element) {ListNode current = head;while (current != null) {if (current.data.equals(element)) {return true;}current = current.next;}return false;}private ListNode getNode(int index) {ListNode current = head;for (int i = 0; i < index; i++) {current = current.next;}return current;}
}
使用示例:public static void main(String[] args) {MyLinkedList list = new MyLinkedList();list.add("A");list.add("B");list.add("C");System.out.println("Size: " + list.getSize()); // 输出:Size: 3list.remove(1); // 删除索引为1的元素System.out.println("Size: " + list.getSize()); // 输出:Size: 2list.set(0, "D"); // 将索引为0的元素设置为"D"System.out.println(list.get(0)); // 输出:DSystem.out.println(list.contains("C")); // 输出:false
}

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

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

相关文章

对于pycharm 运行的时候不在cmd中运行,而是在python控制台运行的情况,如何处理?

对于pycharm 运行的时候不在cmd中运行&#xff0c;而是在python控制台运行的情况&#xff0c;如何处理&#xff1f; 比如&#xff0c;你在运行你的代码的时候 它总在python控制台运行&#xff0c;十分难受 解决方法 在pycharm中设置下即可&#xff0c;很简单 选择运行点击…

python爬虫10:selenium库

python爬虫10&#xff1a;selenium库 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网站产…

LeetCode--HOT100题(34)

目录 题目描述&#xff1a;94. 二叉树的中序遍历&#xff08;简单&#xff09;题目接口解题思路1代码解题思路2代码 PS: 题目描述&#xff1a;94. 二叉树的中序遍历&#xff08;简单&#xff09; 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 LeetCode做…

爆火「视频版ControlNet」开源了!靠提示词精准换画风,全华人团队出品

“视频版ControlNet”来了&#xff01; 让蓝衣战神秒变迪士尼公举&#xff1a; 视频处理前后&#xff0c;除了画风以外&#xff0c;其他都不更改。 女孩说话的口型都保持一致。 正在插剑的姜文&#xff0c;也能“下一秒”变猩球崛起了。 这就是由全华人团队打造的最新视频处理…

性能调优篇 二、Jvm监控及诊断工具-命令行篇

目录 一、概述1、简单命令行工具 二、jps&#xff1a;查看正在运行的Java程序&#xff08;掌握&#xff09;1、是什么&#xff1f;2、测试3、基本语法 三、jstat&#xff1a;查看jvm统计信息&#xff08;掌握&#xff09;1、是什么&#xff1f;2、基本语法3、补充 四、jinfo&am…

记录Taro大坑2丢失api无法启动

现象 解决方案 看了很多。很多说要改成一致的版本号。其实没什么用。 正确方案 再新建一个模板跑起来对比config的配置&#xff0c;以及package.json发现关闭预编译即可。预编译导致api丢失

javaWeb差缺补漏(一)【针对于自身知识点掌握情况】

前端三大件部分 1、a标签的target属性iframe标签的name属性 2、textarea标签&#xff1a;表示多行文本输入。起始标签和结束标签中的内容是默认值。 rows&#xff1a;属性设置可以显示多少行。 cols&#xff1a;属性设置每行显示多少列。 3、form表单的action提交的时候&a…

使用proxman对iOS真机进行抓包

1 打开手机的safari 输入地址 http://proxy.man/ssl 2 下载证书代开设置页面&#xff0c;安装证书 设置信任证书 打开手机设置 &#xff0c;点击通用 点击关于本机、 点击证书信任设置 打开信任设置开关 4 设置手机代理 查看需要设置的代理地址 打开界面 在手机中按…

Redis过期数据的删除策略

1 介绍 Redis 是一个kv型数据库&#xff0c;我们所有的数据都是存放在内存中的&#xff0c;但是内存是有大小限制的&#xff0c;不可能无限制的增量。 想要把不需要的数据清理掉&#xff0c;一种办法是直接删除&#xff0c;这个咱们前面章节有详细说过&#xff1b;另外一种就是…

React基础入门之虚拟Dom

React官方文档&#xff1a;https://react.docschina.org/ 说明 重要提示&#xff1a;本系列文章基础篇总结自尚硅谷课程&#xff0c;且采用类式写法&#xff01;&#xff01;最新的函数式组件写法见高级篇。 本系列文档旨在帮助vue同学更快速的学习react&#xff0c;如果你很…

【SpringCloud技术专题】「Gateway网关系列」(2)微服务网关服务的Gateway功能配置指南分析

Spring Cloud Gateway简介 Spring Cloud Gateway是Spring Cloud体系的第二代网关组件&#xff0c;基于Spring 5.0的新特性WebFlux进行开发&#xff0c;底层网络通信框架使用的是Netty&#xff0c;所以其吞吐量高、性能强劲&#xff0c;未来将会取代第一代的网关组件Zuul。Spri…

【分享】小型园区组网场景

小型园区组网图 在小型园区中&#xff0c;S2700&S3700通常部署在网络的接入层&#xff0c;S5700&S6700通常部署在网络的核心&#xff0c;出口路由器一般选用AR系列路由器。 接入交换机与核心交换机通过Eth-Trunk组网保证可靠性。 每个部门业务划分到一个VLAN中&#…

Verilog语法学习——边沿检测

边沿检测 代码 module edge_detection(input sys_clk,input sys_rst_n,input signal_in,output edge_rise,output edge_down );//存储上一个时钟周期的输入信号reg signal_in_prev;always (posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)signal_in_pre…

【ARM】Day9 cortex-A7核I2C实验(采集温湿度)

1. 2、编写IIC协议&#xff0c;采集温湿度值 iic.h #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "led.h" /* 通过程序模拟实现I2C总线的时序和协议* GPIOF ---> AHB4* I2C1_S…

STM32 进不了main 函数

1. 我用的是STM32L151C8T6 的芯片&#xff0c;在github 上找了个别人的例程&#xff0c;拿来当模板改&#xff0c;由于他用的是HSE 外部晶振&#xff0c;我用的是内部晶振HSI&#xff0c;所以需要改系统时钟&#xff0c;改完后debug&#xff0c; 一直进不了main 函数&#xff0…

SQL地址门牌排序,字典序转为数字序

页面有一批地址数据查询&#xff0c;结果字符排序默认是字典序的&#xff0c;所以造成了门牌3号在30号之前&#xff0c;影响用户体验&#xff1b; id, road_code, road_name, address_fullname, address_name 102 10086 人民一路 北江省南海市西湖区人民一路3号 3号 103 10086…

Docker Desktop 笔记

https://blog.csdn.net/qq_39611230/article/details/108641842 https://blog.csdn.net/KgdYsg/article/details/118213499 1、修改配置 {"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://…

【FAQ】视频云存储/安防监控EasyCVR视频汇聚平台如何通过角色权限自行分配功能模块?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

C++中机器人应用程序的行为树(ROS2)

马库斯布赫霍尔茨 一、说明 以下文章为您提供了对机器人应用程序或框架中经常使用的行为树的一般直觉&#xff1a;ROS&#xff0c;Moveit和NAV2。了解行为 Tress &#xff08;BT&#xff09; 框架的原理为您提供了在游戏领域应用知识的绝佳机会。BT可以与Unity或Unreal集成。 由…

[JavaWeb]【十】web后端开发-SpringBootWeb案例(配置文件)

目录 一、参数配置化 1.1 问题分析 1.2 问题解决&#xff08;application.properties&#xff09; 1.2.1 application.properties 1.2.2 AliOSSUtils 1.2.3 启动服务-测试 二、yml配置文件 2.1 配置格式 2.1.1 新增 application.yml 2.1.2 启动服务 2.2 XML与prope…