一、背景              

LinkedList双向链表;

代码:

Node.java:

package com.cy.collection;

public class Node {
Node previous; //上一个node
Object obj; //node上值
Node next; //下一个node public Node(Object obj) {
this.obj = obj;
}
}

LinkedList.java:

package com.cy.collection;

/**
* 自定义实现链表LinkedList
*/
public class LinkedList {
private Node head;
private Node tail;
private int size; //add
public void add(Object obj){
Node n = new Node(obj);
if(head==null){
head = n;
tail = n;
}else{
n.previous = tail;
tail.next = n;
tail = n;
}
size++;
} //在指定下标位置,插入值
public void add(int index, Object obj){
rangeCheck(index); Node temp = node(index);
Node newNode = new Node(obj); if(temp!=null){
Node up = temp.previous;
if(up==null){ //如果是在head节点前面插入
newNode.next = temp;
temp.previous = newNode;
head = newNode;
}else{
up.next = newNode;
newNode.previous = up; newNode.next = temp;
temp.previous = newNode;
}
size++;
}
} //get
public Object get(int index){
rangeCheck(index); Node temp = node(index);
if(temp!=null){
return temp.obj;
} return null;
} public void remove(int index){
Node temp = node(index); if(temp!=null){
Node up = temp.previous;
Node down = temp.next; if(up==null){ //如果remove的是head节点
down.previous = null;
head = down;
}else if(down==null){ //如果remove的是tail节点
up.next = null;
tail = up;
}else{ //remove的是中间节点
up.next = down;
down.previous = up;
}
size--;
}
}

   //找到指定位置index的node
public Node node(int index){
Node temp = null;
if(head!=null){
if(index < (size>>1)){ //从head开始遍历
temp = head;
for(int i=0;i<index;i++){
temp = temp.next;
}
}else{ //从tail开始遍历
temp = tail;
for(int i=size-1;i>index;i--){
temp = temp.previous;
}
}
}
return temp;
} //size
public int size(){
return size;
} //range check
public void rangeCheck(int index){
if(index<0 || index>=size){
throw new RuntimeException("IndexOutOfBoundsException");
}
}
}

Test.java测试:

package com.cy.collection;

public class Test {

    public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add("aaa");
list.add("bbb");
list.add("ccc"); System.out.println(list.size()); list.add(2, "ddd"); System.out.println(list.get(3));
System.out.println(list.size());
} }

输出:

3
ccc
4

LinkedList的自定义实现的更多相关文章

  1. 自定义listView添加滑动删除功能

    今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个 ...

  2. 深入Collection集合

    List集合 一.ArraryList: 最基本的集合不多做介绍 二.Vector Vector cn=new  Vector(); A:有特有功能 a:添加       public void ad ...

  3. java12

    1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector: 底层数据结构是数组,查询快,增删慢 线程安全,效率低 ...

  4. java16

    1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector: 底层数据结构是数组,查询快,增删慢 线程安全,效率低 ...

  5. java中Collection类及其子类

    1:对象数组(掌握) (1)数组既可以存储基本数据类型,也可以存储引用类型.它存储引用类型的时候的数组就叫对象数组. 2:集合(Collection)(掌握) (1)集合的由来? 我们学习的是Java ...

  6. javaSE第十六天

    第十六天    140 1:List的子类(掌握)    140 (1)List的子类特点    140 (2)ArrayList    141 A:没有特有功能需要学习    141 B:案例    ...

  7. java基础(十五)集合(二)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  8. Java学习笔记之集合

    集合(Collection)(掌握) (1)集合的由来? 我们学习的是Java -- 面向对象 -- 操作很多对象 -- 存储 -- 容器(数组和StringBuffer) -- 数组而数组的长度固定 ...

  9. Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

    protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的 ...

随机推荐

  1. linux cent os 6 的安装

    目前,只有图片,没有仔细写,这是在虚拟机内的安装:

  2. sparkStreaming获取kafka数据(java版本)

    环境 spark-2.2.0 kafka_2.11-0.10.0.1 jdk1.8 配置好jdk,创建项目并将kafka和spark的jar包添加到项目中,除此之外还需要添加spark-streami ...

  3. PostgreSQL的配置文件

    PostgreSQL的配置文件主要有如下3个(postgresql.conf,pg_hba.conf,pg_ident.conf)可以通过如下方式查找:postgres=# select name, ...

  4. linux内核入门(1)——基本简介和编译

    获取linux内核源码,自己选择版本(我下载的是linux-3.1.10.tar.gz ,我是直接下载到/usr/src文件夹的) 下载地址传送门 https://www.kernel.org/pub ...

  5. Nginx——debug的使用

    个人理解,debug的用处在于可以更进一步地了解页面访问出现问题的原因 nginx的debug的功能需要在编译安装时使用–with-debug选项 ./configure --prefix=/usr/ ...

  6. inux下C中怎么让才干安全关闭线程

    前言:     多线程程序中,特别是频繁申请.释放线程的情况下,就要注意线程的关闭,最好使用线程池. 一,线程退出方式     (1) 运行完毕后隐式退出:     (2) 由线程本身显示调用pthr ...

  7. Sublime Text怎么快速建立一个html5页面模板

    在编辑器中输入一个半角英文的感叹号(!),然后按下TAB键

  8. Java参数验证Bean Validation 框架

    1.为什么要做参数校验? 参数校验和业务逻辑代码分离,参数校验代码复用,统一参数校验方式.校验不太通过时统一异常描述. 2.bean validation规范 JSR303 规范(Bean Valid ...

  9. git push文件到远程github或者gitlab

    Git global setup git config --global user.name "luozeng" git config --global user.email &q ...

  10. Linux下vim基本操作和清空文件内容的常用方法

    以前都是用的很土的办法,大概有以下几种.1.直接删除,创建一个新的同名文件(这种方法的弊端是有可能这个文件带着权限或者是属性,那么你新建这个文件后有可能会导致权限不正确或者丢失属性).2.使用vim编 ...