一、背景              

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. Automatic Text Difficulty Classifier Assisting the Selection Of Adequate Reading Materials For European Portuguese Teaching --paper

    the system uses existing Natural Language Processing (NLP) tools, a parser and an hyphenator, and tw ...

  2. 20155208徐子涵 2016-2017-2 《Java程序设计》第2周学习总结

    20155208徐子涵 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 第三章 基础语法 3.1 类型.变量与运算符 • 关键字:在定义java文件名的时候要 ...

  3. 编写一个漂亮的网站 第一课堂 基于vs编辑

    前台代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"& ...

  4. 用Git向gitHub上传项目

    用Git向gitHub上传项目 1.安装git 2.在git安装目录下,运行git-bash.exe  如图所示 3.在git中绑定你注册gitHub是的用户名.邮箱. $ git config -- ...

  5. zabbix使用企业微信发送告警信息

    用qq邮箱发送告警信息一点都不方便,看到网上说也可以使用微信发送告警信息,所以就试了一下. 首先先试着在虚拟主机上给微信发送信息. 我们需要注册企业微信,注册时有一个地方需要注意,就是注册时选择组织, ...

  6. MySQL Binlog信息查看

    ##=====================================## ## 在MySQL内部查看binlog文件列表 ## SHOW BINARY LOGS; ##=========== ...

  7. out, ref 和 params 的区别和用法

    1. out 参数. 如果你在一个方法中,返回多个相同类型的值,可以考虑返回一个数组. 但是,如果返回多个不同类型的值,返回数组就不可取.这个时候可以考虑使用out参数. out参数就侧重于在一个方法 ...

  8. Bartender 使用 Excel xlsx 数据库时出现 0x800A0E7A

    Bartender 使用 Excel 数据库时出现 0x800A0E7A 这是因为没有装 数据库驱动的原因. 安装微软的驱动就可以. 注意是安装 32 位的驱动. https://www.micros ...

  9. 我发起了一个 .Net 平台上的 产生式编程 开源项目 GP.Net

    大家好 , 我发起了一个 .Net 平台上的 产生式编程 开源项目 GP.Net . 我们可以先看看一个网友的 代码生成器 项目 : <.Net 代码生成器 for PostgreSql> ...

  10. ML(6)——改进机器学习算法

    现在我们要预测的是未来的房价,假设选择了回归模型,使用的损失函数是: 通过梯度下降或其它方法训练出了模型函数hθ(x),当使用hθ(x)预测新数据时,发现准确率非常低,此时如何处理? 在前面的章节中我 ...