自己实现了一个简单的LinkedList

/**
* Create by andy on 2018-07-03 11:44
* 根据 {@link java.util.LinkedList}源码 写了一个简单的实现,方便理解设计流程
* 该类是线程不安全的
*/
public class FrameLinkedList<E> {
private Node<E> first;
private Node<E> last;
private int size; public int getSize() {
return size;
} public E getFirst() {
if (first == null)
return null;
return first.item;
} public E getLast() {
if (last == null)
return null;
return last.item;
} /**
* 根据元素位置取元素的值
* 从这个例子中就可以看出来,为什么LinkedList获取元素比较慢,因为每次取出元素都有进行一次循环!!!!
*
* @param index
* @return
*/
public E get(int index) {
if (index < 0)
throw new IllegalArgumentException("参数不能小于0");
if (index >= size)
throw new IllegalArgumentException("参数太大了,当前集合最大长度为:" + size); //如果索引小于当前元素个数的一半,就从头部开始循环,否则从尾部开始循环
Node<E> node = first;
if (index < size >> 1) {
//把头给节点,便于下面递归循环
for (int i = 0; i < index; i++) {
node = node.next;
}
} else {
//把尾给节点,便于下面递归循环
node = last;
for (int i = size - 1; i > index; i--) {
node = node.prev;
}
}
return node.item;
} public void add(E e) {
if (size == 0) {
//第一次添加对象
Node<E> curr = new Node<>(e, null, null);
curr.item = e; //当前对象
first = curr;
last = curr;
} else {
Node<E> curr = new Node<>(e, last, null);
last.next = curr;
last = curr;
}
size++;
} public boolean remove(E e) {
if (size == 0) return false;
//分两种来处理防止e为null的时候出现空指针异常
if (e == null) {
for (Node<E> n = first; n != null; n = n.next) {
if (n.item == null) {
remove(n);
return true;
}
}
} else {
for (Node<E> n = first; n != null; n = n.next) {
if (e.equals(n.item)) {
remove(n);
return true;
}
}
}
return false;
} private void remove(Node<E> node) {
Node<E> prev = node.prev;
Node<E> next = node.next;
if (prev == null) {
//移除的是第一个
node.next = null;
next.prev = null;
first = next;
} else if (next == null) {
//移除的是最后一个
node.prev = null;
prev.next = null;
last = prev;
} else {
//移除的是中间
node.prev = null;
node.next = null; prev.next = next;
next.prev = prev;
}
node.item = null; //便于回收item
size--;
} private static class Node<E> {
E item; //当前对象
Node<E> prev; //上一个对象的Node
Node<E> next; //下一个对象的Node Node(E item, Node<E> prev, Node<E> next) {
this.item = item;
this.prev = prev;
this.next = next;
}
} public static void main(String[] args) {
FrameLinkedList<String> list = new FrameLinkedList<>();
list.add("a1");
list.add("a2");
list.add("a3");
list.add("a4");
list.add("a5");
for (int i = 0; i < list.getSize(); i++) {
System.out.println(list.get(i));
}
System.out.println("-------");
list.remove(list.get(4));
for (int i = 0; i < list.getSize(); i++) {
System.out.println(list.get(i));
} }
}

自己根据java的LinkedList源码编写的一个简单的LinkedList实现的更多相关文章

  1. Flink源码分析 - 剖析一个简单的Flink程序

    本篇文章首发于头条号Flink程序是如何执行的?通过源码来剖析一个简单的Flink程序,欢迎关注头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech) ...

  2. Java-链表LinkedList源码原理分析,并且通过LinkedList构建队列

    在这里我们介绍一下最简单的链表LinkedList: 看一下add()方法: public boolean add(E e) { linkLast(e); return true; } void li ...

  3. 转:【Java集合源码剖析】LinkedList源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/35787253   您好,我正在参加CSDN博文大赛,如果您喜欢我的文章,希望您能帮我投一票 ...

  4. java基础解析系列(十)---ArrayList和LinkedList源码及使用分析

    java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...

  5. 【java集合框架源码剖析系列】java源码剖析之LinkedList

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识. ...

  6. Java集合:LinkedList源码解析

    Java集合---LinkedList源码解析   一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据re ...

  7. Java集合之LinkedList源码解析

    LinkedList简介 LinkedList基于双向链表,即FIFO(先进先出)和FILO(先进后出)都是支持的,这样它可以作为堆栈,队列使用 继承AbstractSequentialList,该类 ...

  8. Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap

    声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...

  9. 【源码阅读】Java集合之二 - LinkedList源码深度解读

    Java 源码阅读的第一步是Collection框架源码,这也是面试基础中的基础: 针对Collection的源码阅读写一个系列的文章; 本文是第二篇LinkedList. ---@pdai JDK版 ...

随机推荐

  1. 6. Laravel5学习笔记:IOC/DI的理解

    介绍 IOC 控制反转 Inversion of Control 依赖关系的转移 依赖抽象而非实践 DI 依赖注入 Dependency Injection 不必自己在代码中维护对象的依赖 容器自己主 ...

  2. 最全ASCII对应码表-键值

    OCT(八进制) 最全ASCII码对应表—与键盘按键对应值 (二进)Bin    (十进)Dec   (十六进)Hex         缩写/字符                            ...

  3. android的五大布局(layout)

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建 筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLa ...

  4. VSCode开发工具下载

    VSCode集成多语言和插件,方便开发和代码管理. 请到此处下载:https://code.visualstudio.com/Download

  5. SET IDENTITY_INSERT <Table Name> ON/OFF 转载

    This command is from SQL Server.  This command is to enable the users to set their own value for IDE ...

  6. python访问纯真IP数据库的代码

    通过IP地址判断客户端是网通的还是电信的. 使用一个纯文本的IP纯真数据库,用Python写了一个小程序. 核心代码: #!/usr/bin/env python #site www.jbxue.co ...

  7. C#反射取数组单个元素的类型

    去bing上查了一下,果然有和我一样蛋疼的朋友,他们在论坛研究了半天,最后还是暴力解决: public Type GetArrayElementType(Type t) { string tName ...

  8. 浅谈HTTPS协议和SSL、TLS之间的区别与关系

    HTTP可能是我们见到过最多的一个字符串了,应该没有之一,而对于HTTPS到来和趋势,我们又开始看到SSL/TLS,所以对于一般不只做技术的人来说这或许还是一个疑问,那么子凡就趁最近在折腾这方面来给大 ...

  9. (译)Getting Started——1.2.4 Tutorial:Storyboard(故事板)

    该教程是基于你在前面的课程中构建的项目上进行的.学完本教程后,你将使用你前面学到的视图.视图控制器.动作.导航的内容,还会为应用创建一些关键的用户界面,并在场景中添加行为 以下就是本节课的内容: 1. ...

  10. shell课后总结

      shell课后总结   作者:高波 归档:学习笔记 2017年12月4日13:31:08 快捷键: Ctrl + 1 标题1 Ctrl + 2 标题2 Ctrl + 3 标题3 Ctrl + 4 ...