JAVA数据结构——线性表

Java数据结构——线性表、队列、栈、堆、集合、散列表、映射的概念   下面是我在学习Java数据结构时梳理出来的一些知识点,供大家学习参考,类和接口的方法没有写出,具体以API文档为准。   数据结构在某种形式上是一种合集,数据结构不仅存储数据,还支持访问和处理数据。数据结构从本质上讲就是一个类,创建一个数据结构就是创建这个类的一个实例,然后使用这个实例上的方法操作这个数据结构。   Java中提供的数据结构通常称为java合集框架   Java合集框架中的... 阅读详情

JAVA数据结构(1)——线性表

1.引言

线性表是典型的数据结构之一,Java API支持多种数据结构,利用集合框架进行具体实现。本文将剖析这些数据结构是如何实现的。
线性表是按顺序储存数据时常用的一种数据结构。线性表的主要操作包括提取、插入、删除、查找以及判断线性表是否为空等功能。实现线性表的方式有两种,一种是数组储存线性表,另一种是使用链式结构。这两种类具备了相同的操作,但都具有不同的实现。

2.线性表的一般特性

为了具体分析线性表的内在功能,我们定义了MyList接口,接口内包含了以下函数。

函数名称具体功能
void add(E e)在线性表末尾添加新元素
E get(int index)获得指定下标的元素
boolean isEmpty()判断线性表是否为空
boolean remove(E e)移除指定下标的元素
int size()返回线性表大小

接口定义如下

public interface MyList<E>{
  public void add(E e);
  public int get(int index);
  pubblic boolean isEmpty();
  public boolean remove(E e);
  public int size();
}

MyList接口内所包含的方法在MyAbstractList抽象类中实现,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但本质上相同的具体概念的抽象。MyAbstrackList类如下:

public abstract class MyAbstractList<E> implements MyList<E>{
  protected int size=0; //线性表大小
  protected MyAbstractList(){} //构造函数
  protected MyAbstractList(E[] objects){
    for(int i=0;i<objects.length;i++)
      add(objects[i]);
  }
  public void add(E e){}//线性表末尾添加元素
  public boolean delete(int index){}//删除指定下标元素
  public int size(){
    return size;
  }//返回线性表大小
}
  • 上述代码我们发现在抽象类MyAbstractList中我们将size定义为了protected,这样做的目的在于MyAbstractList的子类可以访问size,但是在不同包中的MyAbstractList的非子类不能访问它。
  • MyAbstractList抽象类中,我们并没有实现add()以及delete()方法,因为在不同类型的线性表中上述两种方法具有不同的实现。
3.数组线性表

数组是一种大小固定的数据结构。数组一旦创建之后,其大小就无法改变。尽管如此,但我们仍然可以用数组来实现动态的数据结构。解决方法的基本思想是,当数组不能再存储线性表中的新元素时,创建一个更大的新数组来替换当前数组。
数组线性表包含了一个类型为E[]的数组data,向数组中插入一个新元素时,首先确认数组是否有足够的空间。若数组的空间不够,则创建大小为当前数组两倍的新数组,然后将当前数组的元素复制到新的数组中。这样,新数组就变成了当前数组。在指定下标处插入一个新元素前,必须将指定下标后面所有的元素向右移动一个位置并将该线性表的大小增加1。具体实现方法如下所示。

class MyArrayList<E>{
  public static final int CAPACITY=16;
  public int size=0;
  private E[] data=(E[])new Object[CAPACITY];
  public MyArrayList(){}
  public MyArrayList(E[] objects){
    for(int i=0;i<objects.length;i++)
      add(objects[i]);
  }

  public void add(E e){
    add(size,e);
  }

  public void add(int index,E e){
    ensureCapacity();
    if(index<size){
      for(int i=size-1;i>=index;i--)
        data[i+1]=data[i];

      data[index]=e;
    }else data[index]=e;
    size++;
  }

  private void ensureCapacity(){
    if(size>=data.length){
      E[] newData=(E[])(new Object[size*2+1]);
      System.arraycopy(data,0,newData,0,size);
      data=newData;
    }
  }
}

上述数组线性表中的各方法如下:

方法名方法
MyArrayList()构造函数
MyArrayList(E[] objects)根据数组建立数组线性表
void add(int index,E e)在指定下标位置添加元素
void ensureCapacity()判断数组是否已满
4.链表

数组线性表中包含的get(int index)和set(int index, Object o)方法都是典型的通过下标访问和修改元素的方法,这些方法都是高效可行的。但是在数组线性表中,在非尾端添加或删除元素的方法效率很低,因为一旦在数组线性表中间添加删除元素,这样的操作需要移动潜在的大量元素。为了提高在表中任意位置添加删除元素的效率,采用链式结构存储数据的方法应运而生。

4.1 节点

链表中的每个元素都包含了一个称为节点(Node)的结构。当向链表中加入新的元素时,就会产生一个包含它的新的节点。每个节点都和他的相邻节点相链接。
节点可以单招如下方式定义为一个类:

class Node<E>{
  E element;
  Node<E> next;
  public Node(E e){
    element=e;
  }
}

一个链表中包含两个变量head以及tail,head指向链表的第一个节点,tail指向最后一个节点。如果链表为空,则head及tail均为null。我们将利用head和tail来进行链表的创建,创建链表主要包括以下四个步骤。

  • 第一步:声明head和tail
 Node<E> head=null;
 Node<E> tail=null;//此时链表为空
  • 第二步:创建第一个节点并将它追加到链表中
head=new Node<E>();
tail=head;//此时链表存在一个节点,并且head和tail均指向该节点
  • 第三步:创建第二个节点并将它追加到链表中
tail.next=new Node<E>();
tail=tail.next;//此时链表存在两个节点,head仅指向头节点,以后均利用tail在链表末尾添加节点
  • 第四步:循环第二三步

每个节点都包含了元素和一个名为next的数据域,next指向下一个元素。单向链表tail.next所包含的值为null,双向链表tail.next指向头节点head,针对单向链表我们可以利用如下代码循环遍历链表中的所有节点。

Node current=head;
while(current!=null){
  System.out.println(current.element);
  current=current.next;
}
4.2LinkedList类

LinkedList类是使用链式结构实现的动态线性表,它扩展了AbstractList类,此外他它还提供了addFirst、addLassr、emoveFirst、removeLast、getFirst和getLast方法。下表展示了MyLinkedList类中所包含的方法和变量。

方法名方法
MyLinkedList()构造函数
MyLinkedList(Objects[] E)通过对象数组构造链表
void addFirst(E e)在表头添加一个对象
void addLast(E e)在表尾添加一个对象
E getFirst()获取表头元素
E getFirst()获取表尾元素
E removeFirst()删除表头元素并返回
E removeLastt()删除表尾元素并返回

本文不再对上述方法的实现一一赘述,仅展示如何添加创建链表的算法以及删除算法。具体实现如下所示。

class Node<E>{
  E element;
  Node next=null;
  public Node(E e){
    element=e;
  }
}

class MyLinkedList<E>{
  Node head=null;//初始化头节点
  Node tail=null;//初始化尾节点
/*构造函数*/
  public MyLinkedList(){}
  public MyLinkedList(E[] objects){
    for(int i=0;i<objects.length;i++)
      add(objects[i]);
  }
/*添加节点构造链表*/
  public void add(E e){
    if(head==null){
      Node current=new Node(E);
      head=current;
      tail=current;
  }else{
    tail.next=new Node(e);
    tail=tail.next;
  }
 }

上述构造的链表是最基础也是最简单的链表形式,这种链表被称为单链表,除了这种形式的链表外,还存在着其他集中链表的变体。具体形式如下:

  • 循环单链表:除了链表中的最后一个节点的指针指向头节点外,其他都很像单链表。需要注意的是,循环单链表不需要tail。
  • 双向链表:这种形式的链表的Node类型中包含了两个指针的节点,一个指向下一个节点,而另一个指向前一个节点。为了方便起见,一般对上述两个指正命名为前向指针(next)以及后向指针(previous),本文在此给出双向链表实现示例。
class Node<E>{
  E element;
  Node next=null;
  Node previous=null;
  public Node(E e){
    element=e;
  }
}

class DoubleLinkedList<E>{
  Node head=null;
  Node tail=null;
  public DoubleLinkedList(){}
  public DoubleLinkedList(E[] objects){
    for(int i=0;i<objects.length;i++)
      add(objects[i]);
  }
 /*双向链表添加节点方法*/
  public void add(E e){
    if(head==null){
       Node newNode=new Node(e);
       head=newNode;
       tail=head;  
    }else{
       tail.next=new Node(e);
       tail.next.previous=tail;
       tail=tail.next;
    }
  }
}
  • 循环双向链表:除了链表中最后一个节点的前向指针(next)指向第一个节点,且第一个节点的前向指针(previous)指向最后一个节点外,其他都与双向链表保持一致。
5.小结

本文主要介绍了数据结构中的线性表,以及线性表中的数组线性表、链表、以及链表的变体。定义一个数据结构其本质上就是定义一个类。数据结构的类应该使用数据域存储数据,并提供对这些数据进行操作的方法,例如线性表中的插入和删除等。创建一个数据结构其本质就是实例化一个数据结构类,可以应用各种数据结构类中的方法去处理存储在数据域中的数据。

SAR动目标检测三剑客:DPCA/ATI/STAP技术选型指南(含2023最新实验数据对比) 本文深入对比了SAR动目标检测三大主流技术DPCA、ATI与STAP的核心原理与性能差异。基于2023年最新实验数据,分析了它们在最小可检测速度、测速精度、计算复杂度及对通道失配敏感度等方面的优劣,并结合海洋监视与城市交通监控等典型场景,提供了具体的技术选型指南与工程落地考量。 阅读详情

相关推荐

[统计模型] 基于R的潜在剖面分析(LPA)

本文主要介绍基于R进行潜在剖面分析(Latent Profile Aanalysis, LPA)。 关于潜在类别分析LCA/潜在剖面分析LPA的概念和区别,可以参考一下这篇文章: 潜在类别分析LCA \潜在剖面分析LPA介绍https://www.jianshu.com/p/4c830094131e?utm_campaign=maleskine 但是此文对潜类别分析的阐释还比较生涩,而且没有具体的代码编写、模型优选等内容。本文旨在丰富LPA的内容,并希望和大家交流、共同进步。 1. 什么是潜类别分.

bigstar863的博客 1万+

【Java数据结构】线性表

线性表我认为就是数组。。。 创建: private int[] elements;//元素 private int size;//List中当前的元素个数 public MyArrayList() { this(1);//List默认大小为1 } /** * 按指定大小capacity构造List * * @param capacity List初始化时的大小 */ public MyArrayList(in

m0_51692337的博客 541

Blazor Session设置

微软官方封装了一些浏览器的操作,其中就有Session的操作的封装ProtectedSessionStorage 微软文档因为我们知道,依赖注入的生命周期是Singleton程序Scoped网页:刷新,url直接跳转都会重置。Transient路由C# Blazor 学习笔记(10):依赖注入但是没有一个和浏览器绑定的生命周期。即浏览器关闭才会退出。这个是后端无法获取的,因为后端根本不知道浏览器何时关闭。这个只能用浏览器自带的缓存。

qq_44695769的博客 1788

1..1线性表

B站视频笔记(如侵删) 1.线性表的应用 例1:设A和B为两个线性表,现比较A和B的大小: 比较原则:首先去掉A和B的最大前缀子集之后,如果A,B为空,则A=B;A空B不空,则A<B;A不空B空,A>B; //伪代码 Int Compare(SqList A,SqList B) { //若A<B,return -1;A>B,ret...

嗑盐工作室 1087

速腾聚创多激光雷达点云采集,并用RVIZ进行显示

在ubuntu20.04系统下,使用速腾聚创官方提供的软件RSView,对激光雷达的默认IP地址、MSOP 包端口号、 DIFOP包端口号和时间模式等配置进行查看和修改。使用交换机对两个激光雷达进行组网,实现多激光雷达数据采集,并用RVIZ同时显示两个雷达点云。使用wireshark对比两个雷达数据包。

abanchao的博客 5888

android6 usb默认文件管理,不弹RSA配对提示框

本文修改针对 高通 Android6.0.1 出user版本时 https://www.cnblogs.com/Jokeyyu/p/7424262.html http://blog.youkuaiyun.com/sinc00/article/details/44957943 diff --git a/frameworks/base/packages/SystemUI/src/com/android...

木叶风的博客 692

算法设计-比较两个线性表的大小

设A={a1,…an},B={b1,….bm}为两个线性表。 &gt;比较原则:首先去掉A,B两个集合的最大前缀子集之后如果A,B为空,则A=B; 如果A空B不空,A&lt;B;如果B空A不空,A&gt;B;如果A和B均不空,首元素大者为大。 &gt;int Compare(SqList A,SqList B){ while(j&lt;A.length&amp;&amp;j&lt;B.lengt...

愚 公 4250

AD21导出gerber文件

文件–>制造输出–>Gerber Files 文件–>制造输出–>Gerber Files 通用、光圈和高级跟第一步一样 3.文件–>制造输出–>NC Drill Files 这个默认就可以了 主要参考视频来自bilibili添加链接描述 此篇博客主要是写给自己好记的,无其他商业用途 ...

新手小杨 1万+

数据结构算法——1005. 线性表的比较

题目 思路 字典序,比较长度,然后逐一比较内容大小 代码 #include<iostream> using namespace std; typedef int data; int main() { data a,b; cin >> a >> b; data*A = new data[a]; data*B = new data[b]; for(int i = 0; i < a; i++) cin >&

JamSlade的博客 1190

RuntimeError: The current installed version of g++ (4.8.5) is less than the mininum version CUDA解决方案

本文主要介绍了RuntimeError: The current installed version of g++ (4.8.5) is less than the mininum version CUDA解决方案,希望能对学习python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

【医学图像处理】X-ray成像之X射线的产生

【医学图像处理】X-ray成像之X射线的产生 概述 电流流过钨丝,并将其加热。 随着加热,增加的能量使电子能够通过热电子发射从灯丝中释放出来。 电子被吸引到带正电的阳极,并以由管电位(电压)确定的最大能量撞击钨靶。 当电子轰击目标时,它们通过轫致辐射和特有的相互作用将能量转换为热量(99%)和X射线光子(1%)。 X射线光子以一束能量(X射线光谱)从光束中释放出来,构成X射线图像形成的基础。 设备 阴极 灯丝 用细的(0.2毫米)钨丝制成,因为钨: 原子序数高(A 184,Z 74) 是良好的热

ZhangPY的专栏 2358

java 线性表定义_java数据结构之线性表

线性表概述线性表是最基本、最简单、也是最常用的一种数据结构。在线性表中数据元素之间的关系是线性,数据元素可以看成是排列在一条线上或一个环上。线性表分为静态线性表和动态线性表,常见的有顺序表(静态的)、单向链表(动态的)和双向链表(动态的)。线性表的操作主要包括:(1)计算表的长度n。(2)线性表是否为空(3)将元素添加到线性表的末尾(4)获取第i个元素,0≤i < n。(5)清除线性表(6)...

weixin_35284593的博客 564

msf后渗透之获取登入password、远程控制、调用摄像头

在terminal输入load kili creds_all直接获取密码(不一定成功) 使用kiwi_cmd sekurlsa::logonpasswords获取密码

m0_61506558的博客 2964

java初始化线性表_Java数据结构——线性表

Java数据结构——线性表的顺序存储实现一、描述线性结构特点:(1)存在唯一的一个被称作“第一个”的数据元素(2)存在唯一的一个被称作“最后一个”的数据元素(3)除第一个之外,集合中的每个数据元素均只有一个前驱(4)除最后一个之外,集合中的每个数据元素均只有一个后继线性表:是n个数据元素的有限序列。常用的两种存储结构为:线性表的顺序存储结构和线性表的链式存储结构。线性表的顺序表示:指的是用一组地址...

weixin_39589923的博客 547

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JAVA数据结构之线性表

线性表是其组成元素间具有线性关系的一种数据结构,对线性表的基本操作主要有,获取元素,设置元素值,遍历,插入,删除,查找,替换,排序等。而线性表可以采用顺序储存结构和链式储存结构,本节主要讲解顺序表、单链表以及双链表的各种基本操作。 1:线性表抽象的数据类型 线性表:是由n(n>=0)个数据相同的元素组成的有限序列。线性表的定义接口如下 public interface IList<T> { /** * 是否为空 * @return */ boo

weixin_53341657的博客 327

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Java数据结构】02-线性表、栈、队列

线性表,栈,队列

m0_73569204的博客 1202

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java 双向链表_Java数据结构之线性表

这篇文章我们来说说Java里一个很重要的数据结构——线性表,还是这张图,线性表对应着下图里的List。​红框里的内容就是线性表的大家族了,其中黄色部分是要重点了解的, 线性表里的元素是按线性排列的(这里的线性指逻辑上的) 线性表分为两大类,分别是顺序表和链表 :一、顺序表顺序表中的数据元素存储是连续的,内存划分的区域也是连续的。存储结构如下图:​我们的ArrayList底层是数组实现的,底层元素在...

weixin_39670267的博客 118

java中线性表_数据结构 Java实现单链表和线性表

1Java数据结构与算法基础数据的逻辑结构可以采用两个方法来描述:二元组、图形。数据结构的二元组形式为:数据结构={D,S}其中D是数据元素的集合;S是D中数据元素之间的关系集合,并且数据元素之间的关系使用序偶来表示。记作,x是它的第一个元素,y是它的第二个元素。对于数据元素中,可以有多个直接前驱元素也可以有多个直接后驱元素。数据元素之间的关系是M对N的联系,我们把具有此种特点的数据结构称为图结...

weixin_30220177的博客 389

数据结构 线性表java_java数据结构--线性表

一、线性表基本概念线性表是其组成元素间具有线性关系的一种线性结构,是由n个数据类型相同的元素构成的有限序列。其具有“一对一”的逻辑关系,与位置有关,除了头尾元素之外,每一个元素都有唯一的前驱元素和后继元素,即元素ai前面的元素为ai-1,后面的元素为ai+1。二、顺序表1、概念顺序存储指用一组地址连续的存储单元 依次存放 线性表中的数据元素的存储结构。用顺序存储的线性表就称为顺序表,所有数据元素的...

weixin_30620121的博客 220

java线性表的实验_《数据结构》实验二:线性表的实验 JAVA

一..实验目的巩固线性表的数据结构,学会线性表的应用。1.回顾线性表的逻辑结构,线性表的物理存储结构和常见操作。2.学习运用线性表的知识来解决实际问题。3.进一步巩固程序调试方法。4.进一步巩固模板程序设计。二.实验时间准备时间为第2周到第4周,具体集中实验时间为第4周第2次课。2个学时。三..实验内容1.建立一个N个学生成绩的顺序表,对表进行插入、删除、查找等操作。分别输出结果。要求如下:1)用...

weixin_42473904的博客 848

java数据结构实现线性表

本篇用java实现数据结构的线性存储 作为我学java数据结构学习笔记 源码分享在github: 1.接口 package code.list; public interface Ilist { public void clear();//置空 public boolean isEmpty();//判空 public int length(); public Ob...

baidu_41860619的博客 949

Java数据结构之线性表

这篇文章我们来说说Java里一个很重要的数据结构——线性表,还是这张图,线性表对应着下图里的List。 红框里的内容就是线性表的大家族了,其中黄色部分是要重点了解的,线性表里的元素是按线性排列的(这里的线性指逻辑上的) 线性表分为两大类,分别是顺序表和链表: 一、顺序表 顺序表中的数据元素存储是连续的,内存划分的区域也是连续的。存储结构如下图: 我们的ArrayList底层是数组实...

十年代码写十年 155

Java数据结构(线性表)--线性表 & 线性表和数组的关系

1. 线性表 线性表是一种最常用、最简单、也是一种最基本的数据结构,它是学习其他数据结构的基 础。线性表在计算机中可以用顺序存储和链使存储两种存储结构来表示。其中用顺序存储结 构表示的线性表称为顺序表,用链使存储结构表示的沉稳给链表。链表又有单链表、双向链 表、循环链表之分。 1.1 线性表的定义 有限的数据元素组成的有限序列,通常表示为(a0,a1,...,ai,...,an-1)。 其中下标i标识数据元素在线性表中的位序号,n为线性表的表长,当n = 0的时候, 此线性表是空表。 1.2 线性表

天行健 君子以自强不息,地势坤 君子以厚德载物。 1608

Java数据结构--线性表

Java算法--排序一、线性表1.1 顺序表1.1.1 顺序表的实现1.1.2 顺序表的遍历1.1.3 顺序表的容量可变1.1.4 顺序表的时间复杂度1.1.5 java中ArrayList实现1.2 链表1.2.1 单向链表1.2.1.1 单向链表API设计1.2.1.2 单向链表代码实现1.2.2 双向链表1.2.2.1 结点API设计1.2.2.2 双向链表API设计1.2.2.3 双向链表代码实现1.2.2.4 java中LinkedList实现1.2.3 链表的复杂度分析1.2.4 链表反转1.2

placid2的博客 653

java数线性表的长度_JAVA数据结构 线性表顺序是实现

1线性表1.1线性表的基本操作线性表是一种最常用的最简单的一种数据结构在计算机中可哟以使用顺序存储和链式存储结构。对于线性表虽然每个数据元素的值不相同但必须具有相同的数据类型,同时数据元素之间按存在一种一对一的逻辑关系及就是(1)第一个数据元素没有前驱这个数据元素称为开始节点(2)最后一个数据元素没有后继这个节点称为终端节点(3)除了第一个和最后一个节点其他节点有且仅有一个前驱和一个后继线性表的基...

weixin_39943383的博客 262
下一篇: JAVA数据结构——二叉树
NJfunkGiser
博客等级 码龄10年 4粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值