顺序表示和链式表示的比较:

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实现线性表-顺序表示和链式表示相关推荐

  1. 数据结构Java实现05----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  2. 数据结构之线性表——(二、链式存储结构)[c语言]

    数据结构之线性表--(二.链式存储结构-单链表) 链式存储结构以及基本运算的实现 背景:由于线性表的存储特点是用物理上的相邻实现逻辑上的相邻,他要求用连续的存储单元顺序存储线性表中的各个元素,所以,对 ...

  3. 数据结构(二)----线性表(List)链式存储结构(1)

    线性表List---链式存储结构 相关概念 链式存储结构/链式表 定义 链式存储特点 单链表 单链表读取 单链表插入 单链表删除 时间复杂度 单链表整表创建 单链表整表删除 顺序存储与链式存储差异 P ...

  4. 什么是线性表?线性表的特点,线性表的顺序存储和链式存储

    线性表的表示 线性表的特点 ai的数据类型相同 位置序列从1开始 除去表头和表位,所有元素有且仅有唯一的直接前驱和后继 线性表的存储结构 顺序存储 可以随机的读取数据,读取方法 loc(a1)是基地址 ...

  5. 数据结构与算法2:线性表的顺序存储与链式存储

    文章目录 线性表 定义 线性表的抽象数据类型(Abstract Data Type) 线性表的顺序存储结构 线性表的链式存储结构 单链表(single linked list) 静态链表 (stati ...

  6. 线性表之顺序存储和链式存储结构

    线性表:由零个或多个数据元素组成的有限序列 线性表有两种物理存储结构:顺序存储结构和链式存储结构 一.顺序存储结构 顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的结点存储在物理位置上相邻的 ...

  7. Java实现线性表(顺序表,链表)

    顺序表: package seqTable;import java.util.ArrayList; import java.util.Scanner;public class SeqList {pri ...

  8. java链式结构_java语言实现队列顺序结构与链式结构

    本文主要向大家介绍了java语言实现队列顺序结构与链式结构,通过具体的内容向大家展示,希望对大家学习java语言有所帮助. 队列的顺序存储结构实现 public class Queue{ privat ...

  9. c语言建立线性表(顺序储存,链式储存,循环,双向)全

    c语言建立线性表 顺序储存 储存结构 初始化(建立)顺序表 查找操作 一.按值查找,找到返回对应的下标 二.按照下标返回元素 插入操作 一.在线性表尾部添加元素 二.在位置i处插入元素 三.顺序表(有 ...

最新文章

  1. express项目创建步骤
  2. 【图像超分辨率】遥感数据的高斯金字塔尺度上推方法研究
  3. mybatis中mysql转义讲解
  4. C语言-数据结构-可变长顺序表的删除操作
  5. Dnsmasq安装与配置-搭建本地DNS服务器 更干净更快无广告DNS解析
  6. [重要] Cocos2dx 3.0 PageView ListView 在Android设备下背景显示为绿色的问题的解决方案
  7. 菜鸟系列之C/C++经典试题(七)
  8. input子系统驱动学习之中的一个
  9. ubuntu E: Could not get lock /var/lib/dpkg/lock - open
  10. #HTTP协议学习# (六)代理
  11. mysql 存储过程 out list_MySQL存储过程中的IN,OUT,INOUT类型 用法
  12. Struts框架的工作原理
  13. Gaussian09 optimization trajectory: python script
  14. 机械设计二级减速器设计
  15. 思科交换机设置端口 trunk 模式报错
  16. 《一只特立独行的猪》摘抄笔记
  17. 正大期货:期货交易常用的软件
  18. [C++]深复制与浅复制
  19. 航空枢纽问题 matlab,[原创]航空领域常用几个速度的定义和说明
  20. 转载 | 万字深度解析 NFT 借贷市场

热门文章

  1. jquery如何调用后台的方法
  2. “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛I 充分利用学习卡(粉)...
  3. LINUX系统一些监管命令
  4. RBAC角色权限设计
  5. 浅谈CSS3中display属性的Flex布局,关于登陆页面属性框的设置
  6. 浅谈JVM的GC策略
  7. linux服务器多网卡bond
  8. 修改以服务方式启动tomcat7的堆内存设置
  9. input子系统分析(转)
  10. jsp页面中静态文件的时间戳