数据结构:顺序表+链表

数据结构:顺序表+链表

一。顺序表:

首先在了解顺序表和链表之前,先了解一下线性表,**线性表(linear list)**是n个具有相同特征元素的有限序列 ,在逻辑上是线性结构,也就是一条连续的直线,但是在物理上不一定是连续的。常见的线性表:顺序表,链表,栈,队列…

顺序表是用一段物理地址连续的存储单元一次储存数据元素的线性结构,一般情况下使用数组存储。在数组上完成数据的增删查改

下面将了解顺序表的底层实现逻辑:

接口:

public interface SeqList {public void add(int data);//新增元素,默认在数组最后进行新增public void add(int pos,int data);//新增元素,在pos这个位置加上data这个数据public boolean contain(int toFind);//查看toFind这个元素是否在数组中存在public int index(int toFind);//查看这个元素在数组中的下标public int get(int pos);//获取pos位置的元素public void set(int pos,int value);//给pos位置的值修改为valuepublic int remove(int toRemove);//删除第一次出现的的关键字keypublic int size();//获取顺序表的长度public void display();//打印顺序表
}

接口的实现:

import java.util.Arrays;public class Main implements SeqList{private int[] elem=new int[10];private int usedSize;@Overridepublic void add(int data) {if(isFull()){elem= Arrays.copyOf(elem,elem.length*2);}this.elem[usedSize]=data;usedSize++;}public boolean isFull(){if(usedSize==elem.length){return true;}return false;}@Overridepublic void add(int pos, int data) {if(pos<0 || pos>usedSize){System.out.println("输入不合法");//可以把这个写进一个方法中,然后写一个异常,如果pos不合法就抛出异常}if(isFull()){elem=Arrays.copyOf(elem,elem.length*2);}for(int i=usedSize-1;i >=pos;i--){//先把所有的元素向后移动一个单元,当i<pos的时候就结束elem[i+1]=elem[i];}elem[pos]=data;usedSize++;}@Overridepublic boolean contain(int toFind) {for(int i=0;i<usedSize;i++){if(elem[i]==toFind){return true;}}return false;}@Overridepublic int index(int toFind) {if(this.contain(toFind)){for(int i=0;i<usedSize;i++){if(elem[i] == toFind){return i;}}}return 0;}@Overridepublic int get(int pos) {if(pos<0||pos>usedSize-1){System.out.println("输入的元素不合法");}else {for (int i=0;i<usedSize;i++){if(pos==i){//System.out.println(elem[pos]);return elem[pos];}}}return 0;}@Overridepublic void set(int pos, int value) {if(pos<0||pos>usedSize){System.out.println("输入不合法");}elem[pos]=value;}@Overridepublic void remove(int toRemove) {int ret=this.index(toRemove);//获取删除元素的下标for(int i=ret;i<usedSize-1;i++){elem[i]=elem[i+1];}elem[usedSize-1]=0;usedSize--;}@Overridepublic int size() {int count=0;for(int i=0;i<elem.length;i++){count++;}return count;}@Overridepublic void display() {for(int i=0;i<usedSize;i++){System.out.println(elem[i]+" ");}}
}

二。ArrayList的使用

ArrayList是以泛型方式实现的,使用时必须先要将其实例化

1.ArrayList的构造:

List<Integer> list1=new ArrayList<>();//构造一个空的列表
List<Integer> list1=new ArrayList<>(10);//构造一个列表,其中含有10个元素

2.ArrayList的常见操作;

import java.util.ArrayList;public class Main {public static void main(String[] args) {ArrayList<Integer> list1=new ArrayList<>();list1.add(10);//加入元素list1.add(0,10)//在0下标的位置插入数字10list1.remove(1);//删除下标为1的值list1.get(2);//获取下标为2的值list1.set(1,3);//把下标为1的位置的值改为3list1.contain(12);//是否有12这个值在此线性表中list1.indexOf(10);//返回第一个值为10的下标list1.size();//获取整个顺序表的元素个数  }
}

注意:

当实例一个空的列表时,第一次add默认分配一个大小为10的内存(在实例化阶段不分配内存)

扩容是自动以1.5倍的形式扩容

3.顺序表的遍历

//法一:
for(int i=0;i<list.size();i++){System.out.println(list.get(i));
}
//法二:
System.out.println(list);

三。ArrayList的具体使用例子

杨辉三角的实现:

在这里插入图片描述

上述这个图片就是我们常说的杨辉三角,在高中的时候没少接触这个东西

这个杨辉三角主要的实现方式是通过二维顺序表实现的,下面将对用二维顺序表来实现杨辉三角的实现

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Soulation {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入");int input=sc.nextInt();List<List<Integer>> list=new ArrayList<>();//第一行的导入List<Integer> arr=new ArrayList<>();arr.add(1);list.add(arr);//从第二行开始,进行计算、for(int i=1;i<input;i++){List<Integer> curRow=new ArrayList<>();curRow.add(1);List<Integer> prevRow=list.get(i-1);for(int j=1;j<i;j++){int val=prevRow.get(j)+prevRow.get(j-1);}curRow.add(1);list.add(curRow);}}
}

四。链表:

在介绍链表之前,先说一下ArrayList的缺点;当在ArrayList任意位置进行删除元素或者增加元素的时候,就需要将所有元素进行前移或者后移,这样时间复杂度就是O(n),效率非常低,因此涉及到数据的大量插入和删除的操作就不太适合ArrayList了,因此引入了链表来解决这个问题

链表是一种物理存储上非连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接的次序进行实现的(物理上是不连续的,但是逻辑上是连续的)

图示:

五。无头单向链表的实现

接口:

public interface SingleLinkedList {public void add(int data);//头插法public void addLast(int data);//尾插法public void addIndex(int index,int data);//把data插入到index位置public boolean contains(int key);//链表中是否存在数据keypublic void remove(int key);//删除第一次出现key数据的节点public void display();//展示链表中所有的元素
}

接口的实现:

public class SingleList implements SingleLinkedList{static class ListNode{public int val;public ListNode next;public ListNode(int val){this.val=val;}}public ListNode head;@Overridepublic void add(int data) {ListNode node=new ListNode(data);if(this.head==null){head=node;}else {node.next=head;head=node;}}@Overridepublic void addLast(int data) {ListNode node=new ListNode(data);ListNode cur=head;if(head==null){head=node;}else{while(cur.next!=null){cur=cur.next;}cur.next=node;}}@Overridepublic void addIndex(int index, int data) {ListNode node=new ListNode(data);int count=0;ListNode cur=head;if(head==null){head=node;}else{while(cur.next!=null){if(count==index-1){ListNode hi=cur.next;cur.next=node;node.next=hi;break;}count++;}}}@Overridepublic boolean contains(int key) {ListNode cur=head;if(head==null){return false;}else{while(cur.next!=null){if(cur.val==key){return true;}cur=cur.next;}}return false;}@Overridepublic void remove(int key) {ListNode cur=head;ListNode last=head;if(head.val==key){head=head.next;}//当要删除的值是链表的第一位的时候while(cur.next!=null){cur=cur.next;if(cur.val==key){last.next=cur.next;}last=last.next;}}@Overridepublic void display() {ListNode cur=head;while(cur!=null){System.out.print(cur.val+" ");cur=cur.next;}}
}

主函数:

public class Main {public static void main(String[] args) {SingleList singleList=new SingleList();singleList.addLast(12);singleList.addLast(23);singleList.addLast(34);singleList.addLast(45);singleList.addIndex(1,2);singleList.display();System.out.println(singleList.contains(2));singleList.remove(23);singleList.display();}
}

以上就是单链表的增删查所有的代码,大家可以尝试自己写一遍

六。LinkedList的使用

1.LinkedList介绍:

LinkedList本质上是一个双向链表,由于链表没有将元素存储在连续的空间之中,元素存储在单独的节点之中,然后通过引用节点将节点连接起来了,因此在插入或删除元素的时候,不需要搬移元素,效率较高

2.LinkedList的构造:

List<Integer> list1=new LinkedList<>();

3.LinkedList的其他方法的介绍:

list1.add(45);//尾插45
list1.add(3,10);//在3这个位置插入10这个数字
list1.remove(2);//删除2位置这个元素
list1.get(2);//获取下标为2的元素的值
list1.set(2,199);//把下标为2的位置的值改为199
list1.contains(199);//查看此链表中是否含有199这个数字
list1.indexOf(199);//返回这个链表中第一次出现199这个元素的下标

4.LinkedList的遍历:

法一:

System.out.println(list);

法二:

for(int i=0;i<list.size;i++){System.out.println(list.get(i));
}

七。ArrayList与LinkedList的区别

不同点ArrayListLinkedList
存储空间上物理上连续逻辑上连续,但是物理上不一定连续
随机访问支持不支持
头插需要搬移元素,效率低,O(n)只用修改引用的指向,空间复杂读:O(1)
插入空间不够时可以进行扩容没有容量大概念
应用场景元素高效存储+频繁访问任意位置删除添加频繁

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

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

相关文章

自动化升级:Conda包依赖的智能更新策略

自动化升级&#xff1a;Conda包依赖的智能更新策略 引言 在科学研究和软件开发中&#xff0c;依赖管理是确保项目顺利进行的关键环节。Conda作为流行的包管理器&#xff0c;提供了强大的依赖更新功能&#xff0c;帮助用户自动化和简化依赖项的更新过程。本文将深入探讨如何在…

WPF依赖附加属性

依赖附加属性的定义 基本过程&#xff1a;声明、注册、包装 依赖附加属性必须在依赖对象&#xff0c;附加属性不一定&#xff0c;关注的是被附加的对象是否是依赖对象 快捷方式&#xff1a;propa tab 关键字&#xff1a;RegisterAttached // 方法封装 public static int …

Unity3d C#实现基于UGUI ScrollRect的轮播图效果功能(含源码)

前言 轮播功能是一种常见的页面组件&#xff0c;用于在页面中显示多张图片/素材并自动或手动进行切换&#xff0c;以提高页面的美观度和用户体验。主要的功能是&#xff1a;自动/手动切换;平滑的切换效果;导航指示器等。可惜Unity的UGUI系统里没有现成的实现该功能&#xff0c…

第五次作业(多表联合查询)

新增员工表emp和部门表dept create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,财务), (102,销售…

Shell学习——Shell echo命令

文章目录 echo命令 echo命令 1.显示普通字符串: echo "It is a test"这里的双引号完全可以省略&#xff0c;以下命令与上面实例效果一致&#xff1a; echo It is a test2.显示转义字符 echo "\"It is a test\""结果将是: "It is a tes…

掌握MOJO命令行:参数解析的艺术

在软件开发中&#xff0c;命令行接口&#xff08;CLI&#xff09;是一种与程序交互的强大方式&#xff0c;它允许用户通过终端输入指令和参数来控制程序的行为。对于MOJO语言&#xff0c;即使它是一个假想的编程语言&#xff0c;我们也可以设想它具备解析命令行参数的能力。本文…

初识C++【命名空间】【输入输出】【缺省参数】【函数重载】

前言 C是一种通用的编程语言&#xff0c;被广泛用于开发各种应用程序&#xff0c;包括系统软件、游戏、手机应用和高性能计算等。它是C语言的扩展&#xff0c;添加了许多新特性和功能&#xff0c;并支持面向对象编程。C可以在不同的平台上编译和运行&#xff0c;具有高效性、可…

开放式耳机哪个品牌比较好?2024最值得推荐的火爆机型!!

在这个快节奏的时代&#xff0c;我们都在寻找那些既能让我们享受音乐&#xff0c;又能保持对外界感知的音频设备。开放式耳机以其独特的设计&#xff0c;满足了这一需求&#xff0c;它们让你在享受音乐的同时&#xff0c;还能听到周围环境的声音&#xff0c;无论是安全出行还是…

华为、H3C、锐捷、思科四大设备厂商交换机配置命令总结合辑

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 一直以来&#xff0c;对于华为、H3C、锐捷、思科交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;四…

OpenSNN推文:盛夏智慧之光:七月高校新闻聚焦

随着夏日的炎炎热浪逐渐升温&#xff0c;七月的校园生活也如火如荼地展开。在这个充满活力的季节里&#xff0c;各大高校不仅迎来了学术交流的高峰&#xff0c;也在科技创新、国际合作等方面取得了显著成就。以下是本月内几所知名高校的重要新闻动态&#xff0c;它们不仅展现了…

数据库 视图

-- 删除旧的视图&#xff08;如果存在&#xff09; DROP VIEW IF EXISTS view_employees_active; -- 创建新的视图 CREATE VIEW view_employees_active AS SELECT id, name FROM employees WHERE status active; 注意事项 如果视图不满足更新条件&#xff08;如包含JOIN、…

谱瑞科技高速传输接口芯片选型应用

谱瑞科技股份有限公司为一专供多种普及显示器以及个人计算机、消费性电子产品与显示面板所使用之高速讯号传输接口标准之混和信号 IC 芯片之领导供货商。谱瑞公司成立于 2005 年为一无自有晶圆厂之半导体公司&#xff0c;并于 2011 年股票在台湾柜台买卖中心正式挂牌交易(股票代…

深入浅出:Scikit-Learn基础教程

引言 Scikit-Learn&#xff08;简称sklearn&#xff09;是Python中一个强大的机器学习库&#xff0c;提供了丰富的工具和模块&#xff0c;帮助我们轻松实现数据预处理、模型训练、评估和预测。本文将通过一个简单的教程&#xff0c;带您快速入门Scikit-Learn&#xff0c;掌握其…

Greenplum(三)【分布式事务和两阶段提交协议】

1、事务实现原理和 WAL&#xff08;单机&#xff09; 属性含义数据库系统实现Atomic&#xff08;原子性&#xff09;事务中的操作要么全部正确执行&#xff0c;要么完全不执行&#xff08;要么成功、要么失败&#xff09;Write Ahead Logging 预写日志&#xff0c;分布式事务&…

C语言希尔排序详解与实例

希尔排序&#xff08;Shell Sort&#xff09;&#xff0c;是由Donald Shell在1959年提出的一种排序算法。它是插入排序的一种高效改进版&#xff0c;通过引入“增量”概念&#xff0c;将原本的线性查找转换为分段查找&#xff0c;从而显著提升了排序效率。本文将深入探讨希尔排…

SRC漏洞挖掘技巧:修改返回包的各种姿势

听说大家都在要星标&#xff0c;我也要一个吧&#xff0c;可以把我的公众号打上小星星吗&#xff1f;~ 又双叕周一了&#xff0c;还是老样子&#xff0c;来篇技术向的给大家提提神吧~ 如果你对漏洞挖掘或技术向不感兴趣&#xff0c;那么到这就可以了&#xff0c;不用再继续往下…

【删库跑路】一次删除pip下载的所有第三方库方法

进入命令行&#xff0c;先list看下库存 pip list导出所有的第三方库至一文件列表 pip freeze >requirements.txt按照列表卸载所有库 pip uninstall -r requirements.txt -y再list看下&#xff0c;可见库存已清空

1、课程导学(react+区块链实战)

1、课程导学&#xff08;react区块链实战&#xff09; 1&#xff0c;课程概述&#xff08;1&#xff09;课程安排&#xff08;2&#xff09;学习前提&#xff08;3&#xff09;讲授方式&#xff08;4&#xff09;课程收获 2&#xff0c;ibloackchain&#xff08;1&#xff09;安…

java:字符缓冲流特有功能

BufferedWriter&#xff1a; void newLine&#xff08;&#xff09;&#xff1a;写一行行分隔符&#xff0c;行分隔符字符串由系统属性定义 BufferedReader&#xff1a; public String readLine&#xff08;&#xff09;&#xff1a;读一行文字&#xff0c;结果包含行的内容的字…

振动分析-11-轴承数据库之深度学习一维故障分类Transformer

Pytorch-Transformer轴承故障一维信号分类(三) 1 制作数据集 import pandas as pd filename = "CWRU_1797.csv" df = pd.read_csv(filename)from sklearn.model_selection import train_test_split df_x=df.drop(labels=1024,axis=1)