1.基于数组的链表

 package array;

 import java.util.Arrays;

 /**
* 基于数组的链表
*
* @author 王彪
*
*/
public class MyArrayList {
private static Object[] elements = null;
private static int size = 0;
private static final int DEFUAT_INITIAL_CAPACITY = 10; public MyArrayList() {
this(10);
} public MyArrayList(int initialCapacity) {
if (initialCapacity < 0) {
throw new IllegalArgumentException("输入容量有误");
}
elements = new Object[initialCapacity];
} //初始化数组
// 保存新元素
public void add(Object ele) {
// 数组的扩容问题
if (size == elements.length) {
Object[] temp = Arrays.copyOf(elements, elements.length * 2);
elements = temp;
}
elements[size] = ele;
size++;
} public Object get(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("输入索引有误");
}
return elements[index];
} public void set(int index, Object newPlayerNum) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("输入索引有误");
}
elements[index] = newPlayerNum;
} public void remove(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("输入索引有误");
}
for (int i = index; i < size - 1; i++) {
elements[i] = elements[i + 1];
}
elements[size - 1] = null;
size--;
} public String toString() {
if (elements == null) {
return null;
}
if (size == 0) {
return "[]";
}
StringBuilder sb = new StringBuilder(size * 3 + 1);
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(elements[i]);
if (i < size - 1) {
sb.append(",");
}
if (i == size - 1) {
sb.append("]");
}
}
return sb.toString();
} public int size() {
return size;
} public boolean isEmpty() {
return size == 0;
} public void clear() {
this.elements = new Object[DEFUAT_INITIAL_CAPACITY];
size = 0;
} }

2.双向链表

 package linked;

 public class MyLinkedArrayList {
protected Node first;
protected Node last;
protected int size; public void addFirst(Object ele) {// 在头部增加
Node node = new Node(ele);
if (size == 0) {
this.first = node;
this.last = node;
} else {
node.next = this.first;
this.first.prev = node;
this.first = node;
}
size++;
} public void addLast(Object ele) {// 在尾部增加
Node node = new Node(ele);
if (size == 0) {
this.first = node;
this.last = node;
} else {
this.last.next = node;
node.prev = this.last;
this.last = node;
}
size++;
} public void remove(Object ele) {
Node current = this.first;
for (int i = 0; i < size; i++) {
if (!current.ele.equals(ele)) {
if (current.next == null) {
return;
}
current = current.next;
}
}
if (current == this.first) {
this.first = current.next;
this.first.prev = null;
} else if (current == this.last) {
this.last = current.prev;
this.last.next = null;
} else {
current.prev.next = current.next;
current.next.prev = current.prev;
}
size--;
} @Override
public String toString() {
if (size == 0) {
return "[]";
} else {
StringBuilder sb = new StringBuilder(size * 3 + 1);
Node current = this.first;// 第一个节点
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(current.ele);
if (i != size - 1) {
sb.append(",");
} else {
sb.append("]");
}
current = current.next;
}
return sb.toString();
}
} public class Node {
public Node(Object ele) {
this.ele = ele;
} Node prev;
Node next;
public Object ele;
}
}

3.双向队列

 package deque;

 import linked.MyLinkedArrayList;

 public class MyDeque extends MyLinkedArrayList {
public Object getFirst() {
return this.first.ele;
} public Object getLast() {
return this.last.ele;
} public void removeFirst(Object ele) {
super.remove(this.first);
} public void removeLast(Object ele) {
super.remove(this.last);
} public void addFirst(Object ele) {
super.addFirst(ele);
} public void addLast(Object ele) {
super.addLast(ele);
} }

4.堆

 package stack;

 import array.MyArrayList;

 //栈
public class MyStack extends MyArrayList {
// 入栈
public void push(Object ele) {
super.add(ele);
} // 删除栈顶元素
public void pop() {
int index = super.size() - 1;
super.remove(index);
} // 查询栈顶元素
public Object peek() {
int index = super.size() - 1;
return super.get(index);
} }

Java数据结构的实现的更多相关文章

  1. Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用

    Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...

  2. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  3. Java数据结构之树和二叉树(2)

    从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...

  4. Java数据结构之树和二叉树

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  5. Java数据结构之线性表(2)

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  6. Java数据结构之线性表

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  7. java 数据结构 图

    以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客,主要是在自己理解的基础上进行记录. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示 ...

  8. java 数据结构 队列的实现

    java 数据结构队列的代码实现,可以简单的进行入队列和出队列的操作 /** * java数据结构之队列的实现 * 2016/4/27 **/ package cn.Link; import java ...

  9. java 数据结构 栈的实现

    java数据结构之栈的实现,可是入栈,出栈操作: /** * java数据结构之栈的实现 * 2016/4/26 **/ package cn.Link; public class Stack{ No ...

  10. Java数据结构和算法

    首先,本人自学java,但是只学习了java的基础知识,所以想接下来学习一下数据结构和算法,但是找了很多教材,大部分写的好的都是用c语言实现的,虽然知道数据结构和算法,跟什么语言实现的没有关系,但是我 ...

随机推荐

  1. [转]Implementing User Authentication in ASP.NET MVC 6

    本文转自:http://www.dotnetcurry.com/aspnet-mvc/1229/user-authentication-aspnet-mvc-6-identity In this ar ...

  2. Jquery实现自动生成二级目录

    在博客园开通博客以后,就看到某位博友写的js自动生成目录的文章,当时觉得生成目录能给阅读带来方便,所以就直接拿来使用了.用了一段时间以后,发现只能生成一级目录,不能生成多级目录,有点美中不足.所以想着 ...

  3. C#基础知识-数组_ArrayList_List(九)

    之前两篇文档讲述了C#中的面向对象的概念,其实这个概念对于很多种语言都是通用的,只不过每种语言具体实现的过程方法不一样,比如Java.C++.python等,这些都是很流行的面向对象的语言在编程语言排 ...

  4. vs文件属性(生成操作)各选项功能

    右击项目里的文件,选择属性(F4)会有[生成操作]的选项. 它提供了14项选择,如图: 在这说一下常用的选项: 1.编译 编译用于c#代码类的操作,编译之后输出在该程序集的bin目录下.换句话说,代码 ...

  5. net2.0实现net3.5特性,如扩展方法,Linq等

    差不多两年没碰net了,今天想做个小工具,于是打开了久违的VS2012,由于客户终端还是winxp时代,而且是net2.0,且升级存在限制,因此必需在2.0下开发,之前的常用库是3.5写的,而且因为3 ...

  6. ubuntu 下查找某个文件的方法

    1.whereis 文件名 特点:快速,但是是模糊查找,例如 找 #whereis mysql 它会把mysql,mysql.ini,mysql.*所在的目录都找出来. 2.find / -name  ...

  7. IO流之递归

    递归: 递归,指在当前方法内调用自己的这种现象 public void method(){ System.out.println(“递归的演示”); //在当前方法内调用自己 method(); } ...

  8. cf375D. Tree and Queries(莫队)

    题意 题目链接 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. Sol 想到了主席树和启发式 ...

  9. jQuery动态添加删除CSS样式

    jQuery框架提供了两个CSS样式操作方法,一个是追加样式addClass,一个是移除样式removeClass,下面通过一个小例子讲解用法. jQuery动态追加移除CSS样式 <!DOCT ...

  10. java面试题之 -----面向切面编程

    这种在运行时,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. 面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是 ...