一、顺序表

​ 顺序表本质是使用数组储存数组的一种数据结构,在计算机的储存中是连续的分配内存的。

​ 下面是我自己使用java实现的简单顺序表结构

package list;

public class MyArrayList {

private Object[] data; //数据

private int length; //目前长度

private int size;  //容量

//空构造器 默认容量10

public MyArrayList(){

this(10);

}

/**

* 初始化表自定义容量

*/

public MyArrayList(int size){

if(size<0){

throw new RuntimeException("定义表容量错误:"+size);

}else {

this.data = new Object[size];

this.size = size;

this.length = 0;

}

}

/**

* 判断容量是否足够,若不够则扩充10

*/

public void SizeIsEnough(){

if(this.length>=this.size){

Object[] newData = new Object[this.size+10];

this.size = size+10;

}

}

/**

* 向表末尾插入一个元素

* @param e 插入的元素

*/

public void add(E e){

data[length++] = e;

}

/**

*  向表的指定位置插入一个元素

* @param e 插入元素的值

* @param index 插入的位置

*/

public void add(E e,int index){

SizeIsEnough();

if(index<0|| index>=length+1){

throw  new RuntimeException("插入元素位置错误"+index);

}

for(int i=length++; i>=index; i--){

data[i] = data[i-1];

}

data[index] = e;

}

/**

* 移除指定位置的元素

* @param index 移除元素的位置

*/

public E remove(int index){

if(index<0||index>=length){

throw  new RuntimeException("删除元素位置错误"+index);

}

E e = Get(index);

for(int i=index;i

data[i] = data[i+1];

}

return e;

}

/**

*  移除最后一个元素

* @return 返回被移除的元素

*/

public E remove(){

return remove(length-1);

}

/**

*  获取指定位置的元素

* @param index 获取元素的位置

* @return 获取的元素的值

*/

public E Get(int index){

if(index<0||index>=length){

throw  new RuntimeException("查找元素位置错误"+index);

}

E e = (E) data[index];

return e;

}

/**

* 获取指定值的元素的位置

* @param e

* @return

*/

public int Get(E e){

for(int i=0; i

if (data[i].equals(e)) {

return i;

}

}

return -1;

}

public int Length() {

return length;

}

public static void main(String[] args) {

MyArrayList list = new MyArrayList<>();

list.add("ming");

list.add("king");

list.add("ling");

for(int i=0;i

System.out.println(list.Get(i));

}

list.remove(2);

list.add("ling",2);

for(int i=0;i

System.out.println(list.Get(i));

}

}

}

二、链表

链表是本质上使用指针储存下一个元素的地址,从而可以在内存中找到下一个元素,形成一个链式的结构。java中没有指针的概念,当时java面向对象的本质就是指针,所以可以使用类作为指针的替代。

以下是我自己实现的简单的单链表

package list;

public class MyLinkList {

private Node head=null;

private int size=0;

/**

* 添加元素

*/

public void  add(E e){

Node node = new Node<>();

node.setData(e);

if(head == null){

head = node;

size++;

return;

}

assert false;

Node tmp = head;

while (tmp.hasNext()){

tmp = tmp.getNext();

}

tmp.setNext(node);

size++;

}

/**

* 删除指定位置的元素

* @param index

* @return

*/

public E remove(int index){

Node tmp = head;

Node preNode;

Node currNode;

int count=0;

if(index < 0 || index >size-1){

throw  new RuntimeException("删除位置错误"+index);

}

while (tmp.hasNext()&&count != index-1){

tmp = tmp.getNext();

count++;

}

preNode = tmp;

currNode = tmp.getNext();

assert currNode != null;

preNode.setNext(currNode.getNext());

size--;

return currNode.getData();

}

public int Size(){

return size;

}

/**

* 移除链表尾部元素

* @return

*/

public E remove(){

return remove(size-1);

}

/**

* 获取指定位置的元素

* @param index

* @return

*/

public E get(int index){

Node tmp = head;

int count=0;

if(index < 0 || index > size-1){

throw  new RuntimeException("查找位置错误"+index);

}

while (tmp.hasNext() && count != index){

tmp = tmp.getNext();

count++;

}

return tmp.getData();

}

public static void main(String[] args) {

MyLinkList linked = new MyLinkList<>();

linked.add("ming");

linked.add("ling");

linked.add("ping");

linked.add("king");

for (int i = 0; i < linked.size; i++) {

System.out.println(linked.get(i));

}

String s = linked.remove();

for (int i = 0; i < linked.size; i++) {

System.out.println(linked.get(i));

}

System.out.println(s);

}

}

class Node {

private E data;

private Node next = null;

public E getData() {

return data;

}

public void setData(E data) {

this.data = data;

}

public Node getNext() {

return next;

}

public void setNext(Node next) {

this.next = next;

}

public boolean hasNext(){

return next != null;

}

}

实现线性表有两种方式。第一种是使用外汇返佣http://www.fx61.com/数组存储线性表的元素。数组是动态创建的。超过数组的容量时,创建一个新的更大的数组,并且将当前数组中的元素复制到新建的数组中。另一种方法是用链表结构实现。链表由节点组成,每个结点都是动态生成的,用来存储一个元素。所有的结点连接成一个线性表。

本文讲述使用变长数组实现线性表

实现代码

package com.billJiang.array;

import java.util.Arrays;

import java.util.Collection;

/**

* Created by billJiang on 2016/11/30.

* 变长数组

*/

public class ArrayList {

private static final int INITIAL_SIZE = 10;

private int size = 0;

private T[] array;

public ArrayList(int initial) {

if (initial <= 0)

initial = INITIAL_SIZE;

array = (T[]) new Object[initial];

}

public void add(T item) {

//数组扩容

if (size == array.length) {

array = Arrays.copyOf(array, size * 2);

}

array[size++] = item;

}

public T get(int index) {

if (index >= size || index < 0) {

throw new IndexOutOfBoundsException("获取的元素超出了数组的界限");

}

return array[index];

}

public T set(int index, T item) {

T oldItem = this.get(index);

array[index] = item;

return oldItem;

}

public int size() {

return this.size;

}

}

测试代码

package com.billJiang.array;

/**

* Created by billJiang on 2016/11/30.

*/

public class ArrayListTest {

public static void main(String[] args) {

ArrayList arrayList=new ArrayList(3);

arrayList.add(new Integer(1));

arrayList.add(new Integer(2));

arrayList.add(new Integer(3));

System.out.println(arrayList.size());

arrayList.add(new Integer(4));

arrayList.set(3,5);

System.out.println(arrayList.size());

}

}

java线性数据结构_Java实现数据结构之线性结构相关推荐

  1. java中数据结构_JAVA中数据结构总结

    本篇文章主要总结一下JAVA中实现的几种数据结构 简述: List>:链表结构. Queue>:队列,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列 ...

  2. java 数据结构_Java版-数据结构-队列(数组队列)

    前言 看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!! 由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现, ...

  3. java数据结构图_java总结数据结构和算法

    数据结构分类:线性结构和非线性结构 线性结构包括:数组,链表,队列,栈: 非线性结构包括:树,图,表: 数组是查询快,插入和删除慢,因为需要对元素移动空间 链表是元素可以不连续内存中,是以索引将数据联 ...

  4. java循环队列_Java版-数据结构-队列(循环队列)

    前情回顾 在上一篇,笔者给大家介绍了数组队列,并且在文末提出了数组队列实现上的劣势,以及带来的性能问题(因为数组队列,在出队的时候,我们往往要将数组中的元素往前挪动一个位置,这个动作的时间复杂度O(n ...

  5. JAVA实现单链表数据结构_java实现数据结构单链表示例(java单链表)

    /** * 单向链表 * */ public class nodelist { private static class node { // 节点类 e data; // 节点上的数据 node ne ...

  6. java 组合对象_Java 中组合模型之对象结构模式的详解

    Java 中组合模型之对象结构模式的详解 一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 ...

  7. 线性数据结构和非线性数据结构(java版)

    文章目录 线性数据结构和非线性数据结构 数据结构 非线性结构 稀疏Sparsearray 数组 队列 数组模拟队列 数组模拟环形队列 链表 单链表 双向链表 约瑟夫问题 栈 数组模拟栈 使用栈完成表达 ...

  8. android栈式存储,线性表数据结构解读(三)栈结构Stack

    在上一篇文章中,我们详细介绍了链式存储结构,并结合LinkedList源码进行了分析,相关文章大家可以点击这里回看我的博客:线性表数据结构解读(二)链式存储结构LinkedList 栈的定义 栈是一种 ...

  9. java 数据结构_Java数据结构学习方法

    Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? 数据结构: Data_Structure,它是储存数据的一种结构体,在此结构中储存一些数据,而这些数据之间有一定的关系. 而各数据元 ...

最新文章

  1. 有关bbr以及锐速的更新搬运
  2. springboot jar服务器运行后无法请求_Spring Boot微服务中Chaos Monkey的应用
  3. kail Linux 安装Parallels Tools
  4. Web应用安全--攻防对抗发展趋势
  5. 哈佛大学计算机科学专,哈佛大学计算机科学专业
  6. 作者:程学旗,中国科学院计算技术研究所研究员、所长助理、副总工程师。...
  7. android小程序_小程序踩坑记
  8. Facebook 正式开源其大数据查询引擎 Presto
  9. Fenzo:来自Netflix基于Java语言的Mesos调度器
  10. android实现标题栏弹框,Android:Dialog对话框、Builder、showDialog、模板方法设计模式...
  11. S102公路第I标段施工图设计--河北工程大学土木工程学院
  12. java 实现按规则自增功能_java基础(二) 自增自减与贪心规则
  13. PDF如何编辑,怎么修改PDF中的文字
  14. 透过CES看国产手机市场变动 “中华酷联”要调位
  15. java applet介绍,Java中的Applet介绍
  16. 本地html本地xml文件怎么打开,处理xml文件怎么打开
  17. 吊打tomcat的高性能web服务器undertow
  18. openCV minMaxLoc
  19. pdb文件及其作用(转)
  20. linux快速入门 快捷高效学习方法

热门文章

  1. python 控制 cmd 命令行颜色
  2. 2013着重发展的4个方向
  3. oracle怎么不让别的电脑连接,[转载]修改计算机名字导致oracle连接不上的解决方案...
  4. 【毕业答辩】毕业答辩PPT模板,风格的选择重要吗?
  5. python客户端与服务器端通信_python客户端与服务器端的通信
  6. node定时任务php 卡,在NodeJs中如何实现定时任务(详细教程)
  7. MODBUS通讯:libmodbus库使用方法
  8. C++引用与指针的比较
  9. 基于机器视觉的眼镜镜片轮廓提取
  10. php5.3启动,关于php5.3.8启动问题