java线性数据结构_Java实现数据结构之线性结构
一、顺序表
顺序表本质是使用数组储存数组的一种数据结构,在计算机的储存中是连续的分配内存的。
下面是我自己使用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实现数据结构之线性结构相关推荐
- java中数据结构_JAVA中数据结构总结
本篇文章主要总结一下JAVA中实现的几种数据结构 简述: List>:链表结构. Queue>:队列,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列 ...
- java 数据结构_Java版-数据结构-队列(数组队列)
前言 看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!! 由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现, ...
- java数据结构图_java总结数据结构和算法
数据结构分类:线性结构和非线性结构 线性结构包括:数组,链表,队列,栈: 非线性结构包括:树,图,表: 数组是查询快,插入和删除慢,因为需要对元素移动空间 链表是元素可以不连续内存中,是以索引将数据联 ...
- java循环队列_Java版-数据结构-队列(循环队列)
前情回顾 在上一篇,笔者给大家介绍了数组队列,并且在文末提出了数组队列实现上的劣势,以及带来的性能问题(因为数组队列,在出队的时候,我们往往要将数组中的元素往前挪动一个位置,这个动作的时间复杂度O(n ...
- JAVA实现单链表数据结构_java实现数据结构单链表示例(java单链表)
/** * 单向链表 * */ public class nodelist { private static class node { // 节点类 e data; // 节点上的数据 node ne ...
- java 组合对象_Java 中组合模型之对象结构模式的详解
Java 中组合模型之对象结构模式的详解 一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 ...
- 线性数据结构和非线性数据结构(java版)
文章目录 线性数据结构和非线性数据结构 数据结构 非线性结构 稀疏Sparsearray 数组 队列 数组模拟队列 数组模拟环形队列 链表 单链表 双向链表 约瑟夫问题 栈 数组模拟栈 使用栈完成表达 ...
- android栈式存储,线性表数据结构解读(三)栈结构Stack
在上一篇文章中,我们详细介绍了链式存储结构,并结合LinkedList源码进行了分析,相关文章大家可以点击这里回看我的博客:线性表数据结构解读(二)链式存储结构LinkedList 栈的定义 栈是一种 ...
- java 数据结构_Java数据结构学习方法
Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? 数据结构: Data_Structure,它是储存数据的一种结构体,在此结构中储存一些数据,而这些数据之间有一定的关系. 而各数据元 ...
最新文章
- 有关bbr以及锐速的更新搬运
- springboot jar服务器运行后无法请求_Spring Boot微服务中Chaos Monkey的应用
- kail Linux 安装Parallels Tools
- Web应用安全--攻防对抗发展趋势
- 哈佛大学计算机科学专,哈佛大学计算机科学专业
- 作者:程学旗,中国科学院计算技术研究所研究员、所长助理、副总工程师。...
- android小程序_小程序踩坑记
- Facebook 正式开源其大数据查询引擎 Presto
- Fenzo:来自Netflix基于Java语言的Mesos调度器
- android实现标题栏弹框,Android:Dialog对话框、Builder、showDialog、模板方法设计模式...
- S102公路第I标段施工图设计--河北工程大学土木工程学院
- java 实现按规则自增功能_java基础(二) 自增自减与贪心规则
- PDF如何编辑,怎么修改PDF中的文字
- 透过CES看国产手机市场变动 “中华酷联”要调位
- java applet介绍,Java中的Applet介绍
- 本地html本地xml文件怎么打开,处理xml文件怎么打开
- 吊打tomcat的高性能web服务器undertow
- openCV minMaxLoc
- pdb文件及其作用(转)
- linux快速入门 快捷高效学习方法
热门文章
- python 控制 cmd 命令行颜色
- 2013着重发展的4个方向
- oracle怎么不让别的电脑连接,[转载]修改计算机名字导致oracle连接不上的解决方案...
- 【毕业答辩】毕业答辩PPT模板,风格的选择重要吗?
- python客户端与服务器端通信_python客户端与服务器端的通信
- node定时任务php 卡,在NodeJs中如何实现定时任务(详细教程)
- MODBUS通讯:libmodbus库使用方法
- C++引用与指针的比较
- 基于机器视觉的眼镜镜片轮廓提取
- php5.3启动,关于php5.3.8启动问题