/**
* <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. z-index堆叠规则

    一.z-index z-index用来控制元素重叠时堆叠顺序. 适用于:已经定位的元素(即position:relative/absolute/fixed). 一般理解就是数值越高越靠上,好像很简单, ...

  2. hdu1251 统计难题

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=1251 题目: 统计难题 Time Limit: 4000/2000 MS (Java/Othe ...

  3. JAVA单例

    单例模式: 1 public class Person{ 2 public static Person per//定义一个静态变量,用来储存当前类的对象 3 private Person()//构造方 ...

  4. UDP模式聊天

    //client (前台) import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAd ...

  5. AC日记——单词替换 1.7 21

    21:单词替换 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区 ...

  6. Discuz论坛搬家手记(X3.2版本)

    Discuz论坛搬家手记(X3.2版本) 客户在虚拟主机上 运行着一个DISCUZ论坛, 主机商限制太多,连MP3都不让放,客户准备是在上面放一个FLASH斗地主游戏的(多人联机版), 加上MYSQL ...

  7. 基于tiny6410的madplay播放器的移植

    在移植madplay之前需要先将所需要的库移植到开发板的文件系统中. 现在每个解压后的文件夹中创建一个文件夹 zlib-1.1.4.tar.gz 解压:tar xvzf  zlib-1.1.4.tar ...

  8. 第六课——UIDynamicAnimator

    今天我们要学习UIDynamicAnimator 仿真物理学 . UIKit 力学(Dynamics) 和动态效果(Motion Effects) . 创建力学基本流程: 创建运动管理 创建运动行为( ...

  9. 1D1D动态规划优化初步

    再学习一下动态规划的基本优化方法- 首先这篇文章应该大家都看过吧-没看过的自行百度 关于实现的思路文章里都给好了-这篇就主要给一点题目啥的 (P.S. 电脑重装了,如果博客发出来有一些奇怪的问题不要在 ...

  10. XAMPP中proftpd的简明配置方法

    XAMPP中proftpd的简明配置方法   用LAMPP的安装方法可以开一个默认的nobody用户,用lampp security就可以初始设置相应的默认用户密码.如果要有多用户,又怎样管理.目录怎 ...