/**
* <p>
* Node 双向链表实体类
* <p>
*
* @author <a href="mailto:yangkj@corp.21cn.com">yangkj</a>
* @version
* @since 2016年8月15日
*/
public class Node { // 双向链表-前一节点
Node previous;
// 双向链表-当前节点对象
Object obj;
// 双向链表-后一节点
Node next; public Node() {
super();
} public Node(Node previous, Object obj, Node next) {
super();
this.previous = previous;
this.obj = obj;
this.next = next;
} public Node getPrevious() {
return previous;
} public void setPrevious(Node previous) {
this.previous = previous;
} public Object getObj() {
return obj;
} public void setObj(Object obj) {
this.obj = obj;
} public Node getNext() {
return next;
} public void setNext(Node next) {
this.next = next;
} }
/**
*
* <p>
* MyLinkList 双向列表
* <p>
*
* @author <a href="mailto:yangkj@corp.21cn.com">yangkj</a>
* @version
* @since 2016年8月15日
*/
public class MyLinkList {
/**
* 首节点
*/
private Node firstNode;
/**
* 尾节点
*/
private Node lastNode;
/**
* 节点个数
*/
private int size; public MyLinkList() {
super();
} /**
* 添加节点
*
* @param obj
*/
public void add(Object obj) {
if (firstNode == null) {
// 如果链表为空,则设置当前对象为首节点,同时也是尾节点;且该节点的前一节点和后一节点都为null
Node node = new Node(null, obj, null);
firstNode = node;
lastNode = node;
} else {
// 直接在lastNode后面添加新的节点
Node node = new Node(lastNode, obj, null);
// 旧的尾节点的下一个节点指向新加节点
lastNode.setNext(node);
// 链表的尾节点设成新加节点
lastNode = node;
}
size++;
} /**
* 指定索引位置上插入节点
*
* @param index
* @param obj
*/
public void add(int index, Object obj) {
Node temp = node(index);
if (temp != null) {
Node up = temp.previous;
Node newNode = new Node(up, obj, temp);
up.setNext(newNode);
temp.setPrevious(newNode);
size++;
}
} /**
* 获取指定节点对象
*
* @param index
* @return
*/
public Object get(int index) {
Node temp = node(index);
if (temp != null) {
return temp.obj;
} else {
return null;
}
} /**
* 越界检测
*
* @param index
*/
private void rangCheck(int index) {
if (index < 0 || index > size) {
throw new ArrayIndexOutOfBoundsException(index);
}
} /**
* 移除指定索引 的节点
*
* @param index
*/
public void remove(int index) {
// 越界检测
Node temp = node(index);
if (temp != null) {
Node up = temp.previous;
Node down = temp.next;
up.next = down;
up.previous = up;
temp = null;
size--;
} } /**
* 获取指定索引下的节点
*
* @param index
* @return
*/
private Node node(int index) {
rangCheck(index);
Node temp = null;
if (firstNode != null) {
temp = firstNode;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
}
return temp;
}
/**
* 设置指定索引的值
* @param index
* @param obj
*/
public void set(int index,Object obj){
rangCheck(index);
Node temp = node(index);
if(temp!=null){
temp.setObj(obj);
}
}
/**
* 获得链表长度
*
* @return
*/
public int size() {
return size;
} public static void main(String[] args) {
MyLinkList linkList = new MyLinkList();
linkList.add("aaa");
linkList.add("bbb");
linkList.add("ccc"); System.out.println(linkList.get(1));
linkList.set(1, "fff");
System.out.println(linkList.get(1)); }
}

Java自己实现双向链表LinkList的更多相关文章

  1. Java实现一个双向链表的倒置功能

    题目要求:Java实现一个双向链表的倒置功能(1->2->3 变成 3->2->1) 提交:代码.测试用例,希望可以写成一个Java小项目,可以看到单元测试部分 该题目的代码, ...

  2. java集合系列之LinkList

    概要  第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45) 第5部分 LinkedList示例 转载请注明出处 ...

  3. JAVA实现单双向链表的增、删、改、查

    单向链表 package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { public static vo ...

  4. Java 数据结构之双向链表

    一.概述: 1.什么是双向链表: 链表中的每个节点即指向前面一个节点,也指向后面一个节点,就像丢手绢游戏一样,每个人都手拉手 2.从头部插入 要对链表进行判断,如果为空则设置尾节点为新添加的节点,如果 ...

  5. JAVA数据结构--LinkedList双向链表

    链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分: ...

  6. java数据结构-05双向链表

    一.双向链式存储: ①简述:要是节点中包含两个指针部分,一个指向前驱元,一个指向后继元,Java中LinkedList集合类的实现就是双向链表 (以下图片为网络收集,侵删) ②特点:数据是非连续的,链 ...

  7. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  8. 图解Java数据结构之双向链表

    上一篇文章说到了单链表,也通过案例具体实现了一下,但是单链表的缺点也显而易见. 单向链表查找的方向只能是一个方向 单向链表不能自我删除,需要靠辅助节点 而双向链表则能够很轻松地实现上面的功能. 何为双 ...

  9. Java数据结构之双向链表

    管理单向链表的缺点分析: 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找. 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找 ...

随机推荐

  1. Nova: 虚机的块设备总结 [Nova Instance Block Device]

    和物理机一样,虚拟机包括几个重要的部分:CPU.内存.磁盘设备.网络设备等.本文将简要总结虚机磁盘设备有关知识. 1. Nova boot CLI 中有关虚机块设备的几个参数 nova boot CL ...

  2. 在一周内学会使用 AUTO CAD

    学习目的: 1.使用AUTO CAD绘制电路板外框.元器件封装: 2.借助软件使用,对产品结构有更深入的体会. 学习过程: 1.由于本人急需在短时间内具备简单的二维绘图能力,故没有借鉴.对比网络上其他 ...

  3. 【CSS】使用边框和背景

    1. 应用边框样式 先从控制边框样式的属性开始.简单边框有三个关键属性:border-width.border-style 和 border-color . <!DOCTYPE html> ...

  4. [转]基于display:table的CSS布局

    当IE8发布时,它将支持很多新的CSS display属性值,包括与表格相关的属性值:table.table-row和table-cell,它也是最后一款支持这些属性值的主流浏览器.它标志着复杂CSS ...

  5. POJ2157Maze[DFS !]

    Maze Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3818   Accepted: 1208 Description ...

  6. poj2531 Network Saboteur

    Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11122   Accepted: 5372 ...

  7. windows live Writer test

    package com.newegg.shopping.util.listener; import javax.servlet.http.HttpSessionAttributeListener; i ...

  8. PHP高效率写法及原因

    1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...

  9. filestream read方法 循环读取固定文件

    1.循环读取啊,byte[]可以定义为1024或者2049等等,不要超过int的maxvalue就可以.然后取出来操作完再去取. FileStream stream = new FileStream( ...

  10. 牛X的CSS3

    See the Pen Dot Wave by Rich Howell (@roborich) on CodePen