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.小结

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

提交 ieee 手稿出现:Do not include the Reviewer PDF with my submission 怎么办 IEEE投稿Reviewer PDF选项说明 投稿时出现的"Do not include the Reviewer PDF with my submission"选项控制是否附带评审专用PDF文件。Reviewer PDF是系统自动生成包含所有投稿材料的完整PDF,用于同行评审。建议保持默认不勾选状态,除非确认编辑部不需要该文件,否则可能影响审稿流程。勾选表示不附带此PDF,不勾选则会正常生成并提交该评审文件。 阅读详情

相关推荐

PVE 9.0 保姆级安装及优化教程(换源、网络配置、远程唤醒等)【基础篇】

最近,Proxmox VE 推出了基于 Debian 13 的 9.0 版本。正巧我手头有一台闲置的老电脑,与其闲置,不如装上 PVE,让它化身 All in One,继续发挥它的余热。G4560 算是一颗 NAS 神 U,十几元的售价就能有双核四线程,比起什么 J1900 不知道强到哪里去了,尽管定位上是奔腾处理器,但性能甚至能和同代的酷睿 i3-7100 掰掰手腕,并且它还自带 HD 610 的核显,对于解码的支持也还不错。

zc_mk的博客 7511

【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

【电子元件篇】电容的九大作用与选型指南-超简单解读

本文系统介绍了电容的基础概念、核心功能及实际应用。电容作为存储电荷的被动元件,其容值公式为C=Q/V,单位包括法拉及常用派生单位。文章重点解析了电容的九大功能:滤波(通过RC低通电路抑制噪声)、耦合(传递交流隔离直流)、去耦(稳定供电)、储能(短暂供电)、定时(RC延时)、谐振(RLC振荡)、旁路(高频通路)、电压调节(DC-DC转换)以及保护(吸收浪涌)。同时详细阐述了电容分类(陶瓷/电解/薄膜等)、参数选型要点(耐压/容值/精度/温度)及PCB设计注意事项,并针对不同应用场景提供了具体选型建议和常见误区

2301_81299416的博客 4011

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

保姆级教程:在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV(从BIOS到虚拟机配置)

本文提供在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV的详细教程,涵盖BIOS设置、固件配置、驱动优化及虚拟机部署。通过SR-IOV技术,显著提升虚拟化环境中的网络性能,适用于高性能计算、AI训练等场景。

weixin_26934905的博客 455

GIS坐标系转换以及空间校正和地理配准

许多小伙伴都对坐标系,投影这类问题迷迷糊糊,我之前也一样,现在总结一下。 坐标系的转换1.为什么要进行坐标系的转换?2. 不同坐标系的介绍1.地理坐标系我国常见的地理坐标(1).北京54坐标系(2).西安80坐标系(3).WGS-84坐标系(4).大地2000坐标系2.投影坐标系我国常用的投影坐标系(1) UTM投影(2) 高斯-克吕格投影(3) 兰伯特投影(4) 阿尔伯斯投影投影坐标系的选择3. 坐标系的转换1.已知坐标系之间的转换1.1 两坐标系的参考椭球相同1.2 两坐标系的参考椭球不一致,但是GIS

m0_47258611的博客 8913

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

设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

Android 13 录音APK在后台无数据的处理

未获取到录音数据

chenchen4310的博客 1183

数据结构算法——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

解决用加速器以后,电脑无法连接网络的问题

相信很多朋友也遇到过,用加速器以后,电脑网络直接断了,或者访问外网时打不开的情况解决办法是。

qq_46368050的博客 1万+

Bellhop水声信道模型的仿真

Bellhop是一种基于射线追踪的水声信道模型,广泛用于预测水下环境中的声压场。它通过模拟声波在水中的传播路径,计算声场分布,适用于复杂的水下通信场景。

yt94832的博客 1315

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

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

weixin_35284593的博客 564

推荐11个顶级的Claude Code Skills

ClaudeCode的Skills系统为程序员提供了11个强大的AI辅助工具,包括代码审查、重构建议、单元测试生成、API文档自动生成、性能分析、安全扫描、数据库迁移脚本生成、CI/CD配置、依赖管理、ER图生成和日志分析等功能。这些"技能包"可大幅提升开发效率,从代码质量到协作沟通全方位优化工作流程。用户可根据需求选择2-3个核心功能开始尝试,熟练后还可自定义Skills。该系统需要配合Anthropic的API使用,建议先在小型项目测试再应用于核心业务。

分享AI、区块链技术及应用,未来已来 1852

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

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

weixin_39589923的博客 547

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JAVA数据结构之线性表

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

weixin_53341657的博客 327

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

线性表,栈,队列

m0_73569204的博客 1202

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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、付费专栏及课程。

余额充值