一、背景              

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. P1373 小a和uim之大逃离(动态规划)

    题目链接:传送门 题目大意: 一个N行M列的矩阵,从任意点开始往右或者往下走,每走一格获得所到达的格子的分数. 要求总步数必须为偶数.问有多少种走法,使得奇数步得到的总分和偶数步得到的总分对K+1取模 ...

  2. jqGrid 清空单元格的方法

    在工作中,使用到jqGrid的场景是比较多的. 今天在工作中遇到了一个jqGrid的问题,当将单元格的值设置成 '' 空字符串的时候,竟然不会修改成功. $("#mygrid"). ...

  3. Blender 简单齿轮驱动

    直入主题. 1. 用户设置里,勾选扩展网格(Add Mesh: Extra Objects):这样可以直接新增简单齿轮了,免得自己再造轮子. 2. 新增2个齿轮,12赤为主动轮,驱动24赤的被动轮: ...

  4. 10 HashMap,Map.Entry,LinkedHashMap,TreeMap,Hashtable,Collections类

    Map集合的功能概述 添加功能 * V put(K key,V value):添加元素.            * 如果键是第一次存储,就直接存储元素,返回null            * 如果键不 ...

  5. linux(Centos7)服务器硬件改动,进入Emergency模式

    例如移走了某块硬盘后,直接开机就会进入该模式 这是因为/etc/fstab没有正确执行的原因 解决方法: 1)在该模式下输入root密码进入单用户模式(我没试过,不知道行不行,如果不行的话就用忘记ro ...

  6. 代码分层之模拟servlet调用dao

    一:代码分层 com.guangming.dao 存放dao相关的类型 例如 StudentDAOImpl 处理 数据库的链接 存取数据com.guangming.servlet 存放servlet相 ...

  7. tile38 server 密码保护

    默认tile38 是没有密码保护的,我们可以通过配置指定密码,类似redis 的,但是redis 的一般我们是配置在 配置文件中的 环境准备 docker-compose 文件   version: ...

  8. 03关于C的数组指针

    一.数组与指针有什么关系 (1)地址 数组名就是一个地址,指向一个数组的开端. 从实验结果我们可以看出前三个地址都是一样的,都是数组的开始地址,而最后一个是数组的第二个元素,因为是整型数据,地址加4. ...

  9. python之numpy.power()数组元素求n次方

    numpy.power(x1, x2) 数组的元素分别求n次方.x2可以是数字,也可以是数组,但是x1和x2的列数要相同. >>> x1 = range(6) >>> ...

  10. java byte数组与String的相互转换

    String  ->   byte数组 String str = "abc天"; byte[] btr = str.getBytes(); System.out.printl ...