Java实现线性表-顺序表示和链式表示
顺序表示和链式表示的比较:
1.读写方式:顺序表可以顺序存取,也可以随机存取;链表只能从表头顺序存取元素;
2.逻辑结构与物理结构:顺序存储时,逻辑上相邻的元素其对应的物理存储位置也相邻;链式存储时,逻辑上相邻的元素,其物理存储位置则不一定相邻;
3.查找、插入和删除操作:
按值查找,当线性表在无序的情况下,两者的时间复杂度均为o(n);而当顺序表有序时,可采用折半查找,此时时间复杂度为o(log n);
按位查找,顺序表支持随机访问,时间复杂度为o(1);而链表的平均时间复杂度为o(n)。
顺序表的插入和删除操作平均需要移动半个表长的元素;链表的插入、删除操作时,只需修改相关节点的指针即可。
4.空间分配:顺序存储一般是基于静态存储分配,一单存储空间装满就不能扩充;链式存储的节点空间只有在需要的时候申请分配,只要内存有足够的空间即可分配。
顺序表示的实现:
public class ArrayList<E> {final int defaultSize=0; int maxSize; //线性表的最大长度int length; //线性表当前长度Object[] arrayList; //存储线性表的数组/** 构造函数*/public ArrayList(int size){initList(size);}//按给定size初始化顺序表 public void initList(int size) {if(size < 0){throw new RuntimeException("数组大小错误:" + size);}else{this.maxSize= size;this.length=0;this.arrayList = new Object[size];} }//表长public int length() {return length;}//按值查找public int locateElem(Object e) {for(int i=0 ;i<length;i++){if(arrayList[i] == e){return i;}}return -1;}//按位查找public Object getElem(int i) {if(i<0 || i>=length ){throw new RuntimeException("参数出错:"+i);}if(length ==0){throw new RuntimeException("顺序表为空");}return arrayList[i];}//插入public void insert(int i, Object e) {if(i<0 || i>length+1 ){throw new RuntimeException("新元素插入位置有误:"+i);}if(i >= maxSize){throw new RuntimeException("顺序表已满,不能再插入新的元素");}for(int j=length;j<i; j--){arrayList[j]=arrayList[j-1];}arrayList[i]=e;length++;}//删除public void delete(int i, Object e) {if(i<0 || i > length-1){throw new RuntimeException("需删除元素位置有误:"+i);}if(length == 0){throw new RuntimeException("顺序表为空,不能删除元素");}for(int j=i;j<length-1;j++){arrayList[j] = arrayList[j+1];}arrayList[length-1]="";length--;}//判空public boolean isEmpty() {return length==0 ? true : false;}//删除顺序表public void destroyList() {this.arrayList=null;this.length=0;this.maxSize=0;} }
单链表表示的实现:
class Node<E>{E e; //数据Node<E> next; //下一个节点 Node(){}Node(E e){this.e = e;this.next = null;} }public class LinkedList<E> {private Node<E> header = null; //头结点int size=0; //链表大小public LinkedList() {this.header = new Node<E>();}//得到链表的长度public int length() {return size;}//按值查找节点,返回该节点的位置public int locateElem(E e) {Node<E> temp = header;int count = 1;while(temp.next != null && temp.e != e){temp = temp.next;count ++;}return count;}//找到第index个位置的节点public Node<E> getNode(int index) {if(index > size || index < 0){throw new RuntimeException("索引值有错:" + index);}Node<E> temp = new Node<E>();temp = header;int count=1;while(count != index){temp = temp.next;count ++;}return temp;}//尾添加public boolean addToLast(E e) {if(size == 0){header.e = e;}else{Node<E> newnode = new Node<E>(e); //根据需要添加的内容封装为节点Node<E> last = getNode(size); //得到最后一个节点last.next = newnode; }size ++;return true;}//头添加public boolean addTofirst(E e) {if(size == 0){header.e = e;}else{Node<E> newnode = new Node<E>(e); //根据需要添加的内容封装为节点newnode.next = header.next;header.next = newnode;}size ++;return true;}//插入到第index个的位置public boolean insert(int index, E e) {Node<E> newnode = new Node<E>(e); //根据需要添加的内容封装为节点Node<E> cnode = getNode(index-1); //得到第index-1个节点newnode.next = cnode.next;cnode.next = newnode;size++;return true;}//删除第index个节点public boolean delete(int index) {Node<E> prinode = getNode(index-1); //得到被删除的节点的前一个节点Node<E> delnode = prinode.next; //得到被删除的节点prinode.next = delnode.next;size --;return true;}//判空public boolean isEmpty() {return size==0 ? true : false;}public void destroyList() {header = null;size = 0;}//输出public String toString(){StringBuilder s = new StringBuilder("[");Node<E> temp = header;for(int i=0; i < size;i++){s.append(temp.e.toString()+" ");temp = temp.next; }s.append("]");return s.toString();} }
双链表表示的实现
class TNode<E>{E e;TNode<E> prior, next;TNode(){}TNode(E e){this.e = e;prior = null;next = null;} }public class DoubleLinkedList<E> {private TNode<E> header = null; //头结点int size=0; //链表大小public DoubleLinkedList(){this.header = new TNode<E>();}//尾添加public boolean addToLast(E e) {if(size == 0){header.e = e;}else{TNode<E> TNode = new TNode<E>(e); //根据需要添加的内容封装为节点TNode<E> last = getNode(size); //得到最后一个节点last.next = TNode;TNode.prior=last;}size ++;return true;} //找到第index个位置的节点public TNode<E> getNode(int index){if(index > size || index < 0){throw new RuntimeException("索引值有错:" + index);}TNode<E> temp = new TNode<E>();temp = header;int count =1;while(count != index){temp = temp.next;count ++;}return temp;}//插入到第index个的位置public boolean insert(int index,E e){TNode<E> TNode = new TNode<E>(e); TNode<E> cnode = getNode(index-1); //找到第index-1个位置的节点TNode.next=cnode.next;TNode.prior = cnode;cnode.next.prior = TNode;cnode.next = TNode;size++;return true;}//删除第index个节点public boolean delete(int index){TNode<E> delnode = getNode(index);delnode.prior.next=delnode.next;delnode.next.prior= delnode.prior;size--;return true;} }
转载于:https://www.cnblogs.com/CherishFX/p/4607663.html
Java实现线性表-顺序表示和链式表示相关推荐
- 数据结构Java实现05----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- 数据结构之线性表——(二、链式存储结构)[c语言]
数据结构之线性表--(二.链式存储结构-单链表) 链式存储结构以及基本运算的实现 背景:由于线性表的存储特点是用物理上的相邻实现逻辑上的相邻,他要求用连续的存储单元顺序存储线性表中的各个元素,所以,对 ...
- 数据结构(二)----线性表(List)链式存储结构(1)
线性表List---链式存储结构 相关概念 链式存储结构/链式表 定义 链式存储特点 单链表 单链表读取 单链表插入 单链表删除 时间复杂度 单链表整表创建 单链表整表删除 顺序存储与链式存储差异 P ...
- 什么是线性表?线性表的特点,线性表的顺序存储和链式存储
线性表的表示 线性表的特点 ai的数据类型相同 位置序列从1开始 除去表头和表位,所有元素有且仅有唯一的直接前驱和后继 线性表的存储结构 顺序存储 可以随机的读取数据,读取方法 loc(a1)是基地址 ...
- 数据结构与算法2:线性表的顺序存储与链式存储
文章目录 线性表 定义 线性表的抽象数据类型(Abstract Data Type) 线性表的顺序存储结构 线性表的链式存储结构 单链表(single linked list) 静态链表 (stati ...
- 线性表之顺序存储和链式存储结构
线性表:由零个或多个数据元素组成的有限序列 线性表有两种物理存储结构:顺序存储结构和链式存储结构 一.顺序存储结构 顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的结点存储在物理位置上相邻的 ...
- Java实现线性表(顺序表,链表)
顺序表: package seqTable;import java.util.ArrayList; import java.util.Scanner;public class SeqList {pri ...
- java链式结构_java语言实现队列顺序结构与链式结构
本文主要向大家介绍了java语言实现队列顺序结构与链式结构,通过具体的内容向大家展示,希望对大家学习java语言有所帮助. 队列的顺序存储结构实现 public class Queue{ privat ...
- c语言建立线性表(顺序储存,链式储存,循环,双向)全
c语言建立线性表 顺序储存 储存结构 初始化(建立)顺序表 查找操作 一.按值查找,找到返回对应的下标 二.按照下标返回元素 插入操作 一.在线性表尾部添加元素 二.在位置i处插入元素 三.顺序表(有 ...
最新文章
- express项目创建步骤
- 【图像超分辨率】遥感数据的高斯金字塔尺度上推方法研究
- mybatis中mysql转义讲解
- C语言-数据结构-可变长顺序表的删除操作
- Dnsmasq安装与配置-搭建本地DNS服务器 更干净更快无广告DNS解析
- [重要] Cocos2dx 3.0 PageView ListView 在Android设备下背景显示为绿色的问题的解决方案
- 菜鸟系列之C/C++经典试题(七)
- input子系统驱动学习之中的一个
- ubuntu E: Could not get lock /var/lib/dpkg/lock - open
- #HTTP协议学习# (六)代理
- mysql 存储过程 out list_MySQL存储过程中的IN,OUT,INOUT类型 用法
- Struts框架的工作原理
- Gaussian09 optimization trajectory: python script
- 机械设计二级减速器设计
- 思科交换机设置端口 trunk 模式报错
- 《一只特立独行的猪》摘抄笔记
- 正大期货:期货交易常用的软件
- [C++]深复制与浅复制
- 航空枢纽问题 matlab,[原创]航空领域常用几个速度的定义和说明
- 转载 | 万字深度解析 NFT 借贷市场