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. 5. 常见C语言字符串库函数的使用及实现

    1. strncat 函数: [函数原型]#include <string.h> char *strncat( char *str1, const char *str2, size_t c ...

  2. eclipse中查看java源码时,出现source not found问题

  3. O(n^2) 级别的排序算法

    o(n^2) 的排序算法.性能那么差,为什么还要学习? 首先,它是基础,千里之行,始于足下.它编码简单,容易实现,是一些简单情景的首选,它能给我们的问题一个暴力的解法,这样的解法也许不是最优的,但是它 ...

  4. SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  5. 微信小程序之页面之间传递值

    页面之间传值有三种方式 1.url传值 2.本地存储传值 3.全局变量传值 1.url传值: 通过url传值的需要通过option来获取参数值. 更多详情可以访问小程序-navigateTo章节. A ...

  6. [o.e.b.ElasticsearchUncaughtExceptionHandler] [unknown] uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root

    这是因为不知从哪个版本后,elasticsearch为了安全性,是不能用root用户启动的. 解决的办法:当然是创建一个用户,用创建的用户启动啦,注意权限的问题,目录也应该改为创建的用户权限! 我是用 ...

  7. sharding-jdbc springboot配置

    SPRING BOOT配置 注意事项 行表达式标识符可以使用${...}或$->{...},但前者与Spring本身的属性文件占位符冲突,因此在Spring环境中使用行表达式标识符建议使用$-& ...

  8. edX MITx: 6.00.1x Introduction to Computer Science and Programming Using Python 课程 Week 1: Python Basics Problem Set 1 Problem 3

    Assume s is a string of lower case characters. Write a program that prints the longest substring of  ...

  9. vm中centos7磁盘扩容

      在VM虚拟平台管理客户端,将虚拟机关机后,将分配的磁盘大小30G扩至300G.如图.   调整完后,重新打开虚拟机,使用fdisk -l查看,可以看到我们刚刚扩容的空间已经可以看到,但没有分区,还 ...

  10. PIE SDK导出图片

    1. 功能简介 导出图片功能可以将制图模板以及视图.绘制元素.制图元素等保存为图片.本示例程序实现了专题制图下导出图片功能. 2. 功能实现说明 2.1导出图片 2.2 实现思路及原理说明 调用IPa ...