package com.test.collection;

/**
* 自定义实现LinkList
*
* 1.双向链表
* 实现原理:底层封装Node节点对象(每个节点存放有3部分内容:1.上个节点的位置,2.当前节点内容,3.下一个节点的位置)
*
* 2.查询
* LinkList 相较 ArrayList 查询效率低:
* 由于LinkList底层存放元素的不是数组,不能直接通过索引进行获取,需要从头或者从尾逐一遍历索引节点对象。
* ArrayList直接通过索引获取即可。
*
* 3.删除、插入
* linkList 相较ArrayList 插入、删除的效率高
* LinkList 直接打断前后的链接,链接到新对象即可;
* 而ArrayList插入之后需要对后面的元素 进行整体移位
* @author chenx
*
*/
public class MyLinkList {
private Node first;
private Node last;
public int size; public void add(Object obj){
Node node=new Node();
if(first == null){
node.prev=null;
node.element=obj;
node.next=null;
first=node;
last=node;
}else{
//默认直接追加到最后
node.prev=last;
node.element=obj;
node.next=null;
last.next =node;
last =node;
}
size ++;
} /**
* 由于不是数组,不能直接通过索引进行获取,需要从头或者从尾逐一遍历索引节点对象
* 因此,相较ArrayList查询要慢
* @param index
* @return
*/
public Object get(int index){
rangeCheck(index);//下标越界检查
Node temp=node(index);//获取当前节点
return temp.element;
} /**
* 链表移除,直接打断前后的链接,链接到新对象即可;
* 而ArrayList删除之后需要对后面的元素 进行整体移位,
* 因此:linkList 相较ArrayList 删除的速度快
* @param index
* @param obj
*/
public void remove(int index){
rangeCheck(index);//下标越界检查
Node temp=node(index);//获取当前节点
Node up=temp.prev;
Node down=temp.next; if(up==null){
first = down;
}else{
up.next=down;
} if(down==null){
last = up;
}else{
down.prev=up;
} size--;
}
//获取节点
Node node(int index){//通过节点遍历实现类似索引的效果
Node temp=first;
if(first !=null){
if(index <(size >>1)){
temp=first;
for(int i=0;i<index;i++){
temp = temp.next;
}
}else{
temp=last;
for(int i=size;i>index;i--){
temp = temp.prev;
}
}
}
return temp;
}
/**
* 链表插入,直接打断前后的链接,链接到新对象即可;
* 而ArrayList插入之后需要对后面的元素 进行整体移位,
* 因此:linkList 相较ArrayList 插入的速度快
* @param index
* @param obj
*/
public void add(int index,Object obj){
Node temp=node(index);//获取当前节点
Node newNode=new Node();
newNode.element=obj;
if(temp!=null){
Node up=temp.prev;
up.next=newNode;
newNode.prev=up;
newNode.next=temp;
temp.prev=newNode;
size++;
}
} public int size(){
return size;
} //下标越界检查
private void rangeCheck(int index){
if(index<0 || index>size){
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
MyLinkList mylinkList=new MyLinkList();
mylinkList.add("aaa");
mylinkList.add("bbb");
mylinkList.add("ccc"); mylinkList.remove(1);
for(int i=0;i<mylinkList.size;i++){
System.out.println(mylinkList.get(i));
}
}
}

Node.java

package com.test.collection;

public class Node {
Node prev;
Object element;
Node next;
public Node() {
}
public Node(Node prev, Object element, Node next) {
super();
this.prev = prev;
this.element = element;
this.next = next;
}
}

Java集合篇二:LinkList的更多相关文章

  1. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  2. 【由浅入深理解java集合】(二)——集合 Set

    上一篇文章介绍了Set集合的通用知识.Set集合中包含了三个比较重要的实现类:HashSet.TreeSet和EnumSet.本篇文章将重点介绍这三个类. 一.HashSet类 HashSet简介 H ...

  3. Java集合系列(二):ArrayList、LinkedList、Vector的使用方法及区别

    本篇博客主要讲解List接口的三个实现类ArrayList.LinkedList.Vector的使用方法以及三者之间的区别. 1. ArrayList使用 ArrayList是List接口最常用的实现 ...

  4. (Set, Map, Collections工具类)JAVA集合框架二

    Java集合框架部分细节总结二 Set 实现类:HashSet,TreeSet HashSet 基于HashCode计算元素存放位置,当计算得出哈希码相同时,会调用equals判断是否相同,相同则拒绝 ...

  5. java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  6. (转)java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  7. java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...

  8. 不可错过的java面试博客之java集合篇

    1. List List 是有序的 Collection.Java List 一共三个实现类: 分别是 ArrayList.Vector 和 LinkedList ArrayList ArrayLis ...

  9. java基础篇二

    引言 滴,第二天卡. 五.关键字 -static         -初始化顺序             -静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代 ...

随机推荐

  1. java集合类学习笔记之LinkList

    1.简述 LinkList的底层其实就是一个双向链表,所谓的链表就是一个LinkList内部静态静态类(Node),对LinkList的所有操作本质上就是通过对LinkList中新建的Node对象 进 ...

  2. GitHub CEO:GitHub 十年,感谢有你

    简评:不知为何,总感觉 GitHub 成立不止 10 年了,你们有这种错觉么? 本文是 GitHub 联合创始人兼 CEO:Chris Wanstrath 在计算机世界杂志写的文章. 当我们回顾 Gi ...

  3. Jenkins项目部署使用教程-----03节点添加

    1)添加节点 系统管理——>管理节点——>新建节点 进入配置界面 点ok进入配置界面配置,——>高级 点击save保存,进入节点,点击Launch agent使得jenkins服务器 ...

  4. 百度分享,简单的一步操作解决你的网站不支持https访问的问题!

    百度分享,应该是目前最好用的前端分享插件了.然而,官方却没有支持https.现在越来越多的网站都走入https的安全加密队列了,那么在找不到更好地替代品的情况下,怎么能让它支持https呢? 答案当然 ...

  5. springcloud微服务config的使用

    首先需要建立一个server端: pom依赖中加入 <dependency> <groupId>org.springframework.cloud</groupId> ...

  6. Flask (五) RESTful API

    RESTful API 什么是REST 一种软件架构风格.设计风格.而不是标准,只是提供了一组设计原则和约束条件.它主要用户客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易 ...

  7. hdu4513吉哥系列故事——完美队形II 马拉车

    题目传送门 题意:求最长回文串长度,要求回文串左边是非下降. 思路一: 先把连续的回文串,满足先上升再下降的序列处理出来,再对这部分序列做马拉车模板就可以了. 需要注意的是,由于他要的是非下降的序列, ...

  8. JavaScript细节

    1.关于全局变量 全局变量在所有的作用域中都是可见变量.当程序小,代码量小的时候,可能还便于维护,而随着程序越来越复杂,代码量也随之越来越大后,过多的全局变量会变的很难处理.因为一个全局变量可以被程序 ...

  9. phpcms V9 框架目录结构

    phpcms v9框架的目录结构分析:      了解v9框架的目录结构,有助于帮助我们快速建立起对v9框架的一个整体认识 打开"mycms"项目,有如下文件和目录      使用 ...

  10. Oracle分组函数之CUBE魅力

    Oracle的CUBE与ROLLUP功能很相似,也是在数据统计分析领域的一把好手. 关于ROLLUP的查询统计功能请参考文章<Oracle分组函数之ROLLUP魅力>(http://www ...