手工实现Array List和Linked List
Array List样例:
/**
* 增加泛型
* 自动增加数组容量
* 增加set、get方法;增加数组边界的检查
* 增加remove方法
*/
package cn.study.lu.four;
public class MyArrayList <E>{
private Object[] elementData;
private int size;
private static final int DEFALT_CAPACITY = 10;
public MyArrayList() {
elementData = new Object[DEFALT_CAPACITY];
}
public MyArrayList(int capacity) {
elementData = new Object[capacity];
}
public void add(E e) {
if (size==elementData.length) {
Object[] newArray = new Object[elementData.length+(elementData.length>>1)];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
elementData[size++] = e;
}
public Object get(int index) {
Cheak(index);
return (E)elementData[index];
}
public void set(E e,int index) {
Cheak(index);
elementData[index] = e;
}
public void Cheak(int index) {
if (index<0 ||index>size ) {
throw new RuntimeException("索引不合法"+index);
}
}
public void remove(E e) {
//将e和所有元素挨个比较,获得第一个为true的,返回
for (int i = 0; i < size; i++) {
if (e.equals(get(i))) {
remove(i);
}
}
}
public void remove(int index) {
int a = elementData.length-index-1;
if (a>0) {
System.arraycopy(elementData, index+1, elementData, index,a );
}
elementData[--size] = null;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size==0?true:false;
}
public String toString() {
StringBuilder str = new StringBuilder();
str.append("[");
for (int i = 0; i <size; i++) {
str.append(elementData[i]+",");
}
str.setCharAt(str.length()-1, ']');
return str.toString();
}
public static void main(String[] args) {
MyArrayList s1 = new MyArrayList(20);
// s1.add("aa");
// s1.add("bb");
// System.out.println(s1);
for (int i = 0; i < 40; i++) {
s1.add("aaa"+i);
}
System.out.println(s1);
s1.set("啦啦啦", 39);
System.out.println(s1.get(39));
s1.remove(2);
System.out.println(s1);
System.out.println(s1.size());
System.out.println(s1.isEmpty());
}
}
Linked List样例:
package cn.study.lu.four;
/**
* 自定义一个链表并实现打印
*增加泛型
* 增加get方法
* 增加remove的两个方法
* 增加set方法
*
*/
public class MyLinkedList<E> {
private Node first;
private Node last;
private int size;
public void add(E e) {
Node node = new Node(e);
if(first == null) {
first = node;
last = node;
}else {
node.previous=last;
node.next = null;
last.next = node;
last = node;
}
size++;
}
public String toString() {
StringBuilder str = new StringBuilder("[");
Node temp = first;
while (temp!=null) {
str.append(temp.element+",");
temp = temp.next;
}
str.setCharAt(str.length()-1, ']');
return str.toString();
}
public E get(int index) {
Node temp = null;
if (index<0||index>size-1) {
throw new RuntimeException("索引不合法:"+index);
}
if (index<=((size-1)/2)) {
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
}else {
temp = last;
for (int i = size-1; i > index; i--) {
temp = temp.previous;
}
}
return (E)temp.element;
}
public void remove(E e) {
Node temp = first;
while (temp.element != e) {
temp = temp.next;
}
if (temp==null) {
throw new RuntimeException("不存在这个对象!");
}else {
temp.previous.next = temp.next;
temp.next.previous= temp.previous;
size--;
}
}
public void remove(int index) {
Node temp = null;
if (index<0||index>size-1) {
throw new RuntimeException("索引不合法:"+index);
}
if (index<=((size-1)/2)) {
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
}else {
temp = last;
for (int i = size-1; i >index; i--) {
temp = temp.previous;
}
}
if (index==0) {
temp.next.previous = null;
first = temp.next;
}else if (index == (size-1)) {
temp.previous.next = null;
last = temp.previous;
} else {
temp.previous.next = temp.next;
temp.next.previous = temp.previous;
}
size--;
}
public void set(int index,E e) {
Node a = new Node(e);
Node temp = null;
if (index<0||index>size) {
throw new RuntimeException("索引不合法:"+index);
}
if (index<=((size)/2)) {
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
}else if(index!=size) {
temp = last;
for (int i = size-1; i >index; i--) {
temp = temp.previous;
}
}else {
temp=last;
}
if (index == 0) {
a.next = temp;
temp.previous=a;
first = a;
}else if (index==size) {
a.previous=temp;
temp.next = a;
last =a;
}else {
a.previous=temp.previous;
temp.previous.next = a;
a.next = temp;
temp.previous = a;
}
size++;
}
public static void main(String[] args) {
MyLinkedList<String> a = new MyLinkedList<>();
a.add("aaa");
a.add("bbb");
a.add("ccc");
a.add("ddd");
a.add("eee");
a.add("fff");
a.add("ggg");
System.out.println(a);
System.out.println(a.get(5));
a.remove(0);
System.out.println(a);
System.out.println(a.get(5));
a.set(0, "aaa");
System.out.println(a);
System.out.println(a.getSize());
System.out.println(a.get(5));
}
}
class Node{
Node previous;
Node next;
Object element;
public Node(Node previous, Node next, Object element) {
super();
this.previous = previous;
this.next = next;
this.element = element;
}
public Node(Object element) {
super();
this.element = element;
}
}
手工实现Array List和Linked List的更多相关文章
- Lintcode489-Convert Array List to Linked List-Easy
489. Convert Array List to Linked List Convert an array list to a linked list. Example Example 1: In ...
- Array List和Linked List实现分析
一,前言 先来一张Collection集合图. 今天分享一些关于Collection集合中的List,讲真的集合这东西在网上真是老生常谈了.说实话连本人都觉得腻了(哈哈),但是话又说回来,整个 ...
- Leetcode: sliding window maximum
August 7, 2015 周日玩这个算法, 看到Javascript Array模拟Deque, 非常喜欢, 想用C#数组也模拟; 看有什么新的经历. 试了四五种方法, 花时间研究C# Sorte ...
- Java基础知识之集合(容器)简介
JAVA的集合体系,主要由Collection接口,Map接口,Iterator接口和操作集合的工具类Collections组成.其中的Iterator只是一个迭代器,真正的容器则派生自Collect ...
- 【转】Java集合框架综述
文章目录 1. 集合框架(collections framework) 2. 设计理念 3. 两大基类Collection与Map 3.1. Collection 3.2. Map 4. 集合的实现( ...
- 设计模式- 主动对象(Active Object)
译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...
- The C5 Generic Collection Library for C# and CLI
The C5 Generic Collection Library for C# and CLI https://github.com/sestoft/C5/ The C5 Generic Colle ...
- Java基础之集合:概览
Java Basic->Collections->Overview 先抛一个问题,用一个类似树形的结构,介绍下 Java 的集合类数据结构:有哪些,从简单到复杂,有怎么样的继承关系. 下面 ...
- 【转】图片缓存之内存缓存技术LruCache、软引用 比较
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
随机推荐
- 如何吸引用户打开自己发送的EDM邮件
一般来说,邮件发送到用户的收件箱,但用户不一定会阅读.因为每个用户收到的邮件都很多.那么,究竟应该如何吸引读者打开自己的EDM邮件呢? 只有当用户认识并信任发件人的时候,此时邮件的打开率是最高的,可以 ...
- Vultr CentOS下后台跑node
在Mac或者Windows下简直易如反掌.几行命令搞定的事情,但因为使用的是远程SSH连接纯命令行处理,所以需要记录下来怎么弄. 比如, 1. 怎么在什么都没有的CentOS里下载Node安装包? 2 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_12-对象数组
对象数组是怎么回事呢? 新建Person类 代码生成后续的代码 生成一个无参构造 两个成员变量都选上,这是全参构造 生成getter和setter 数组的默认的第几0个元素是null 创建三个对象 输 ...
- 《图解设计模式》读书笔记5-2 decorator模式
目录 代码演示 模式的角色和类图 思路拓展 Decorator模式即装饰器模式,就是对类进行装饰,下面通过代码说明. 代码演示 代码展示的内容 有一个类StringDisplay:表示一句话,比如he ...
- python接口自动化:响应内容中json字符串对象的处理
实现代码如下: import json #定义一个字典.一个列表.两个字符串({}中必须是双引号) di1={"} di2=[{"}] di3='{"name" ...
- unity editor 折叠树
https://blog.csdn.net/e295166319/article/details/52370575 需要两个类:树节点类和界面实现类 1:树节点类(TreeNode) using Un ...
- C++学习笔记(六)--结构体
1.一种自定义的类型--结构体定义: struct 结构体名称 { //成员表列也称作域 还可以包括函数,即函数成员,不过一般结构体类型中不包含,而是放在类中. 类型名 成员名; };这种结构体类型类 ...
- Gradle -- 初体验
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置. ...
- (Git 学习)一个账户怎么创建多个ssh key
(Git 学习)一个账户怎么创建多个ssh key:1.https://segmentfault.com/a/1190000009572470?_ea=1985120 2.https://www.ji ...
- HDU-1269 迷宫城堡(连通分量)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...