Java自己实现双向链表LinkList

时间:2022-12-29 07:31:55
/**
* <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. Structual设计--Flyweight模式

    1.意图 运用共享技术有效地支持大量细粒度的对象. 2.别名 无 3.动机 有些应用程序得意于在其整个设计过程中採用对象技术,但简单化的实现代价极大.如我们在使用word的时候.假设设置正文字体为:t ...

  2. C&num;程序之Main&lpar;&rpar;方法

    一.Main()方法的简介 1.一般情况下,一个C#可执行程序只有一个应用程序对象(也就是就程序入口),但是在某些情况,可能会有多个应用程序对象(程序入口),如单元测试中,这个时候我们就需要通过命令行 ...

  3. hadoop排序组合键的使用情况

    于hadoop当处理复杂的业务,需要使用组合键,与单纯的复杂的继承Writable接口,但继承WritableComparable<T>接口.事实上.WritableComparable& ...

  4. 有了GPRS为什么还要LoRa和NB-IoT?【转】

    转自:https://blog.csdn.net/i_am_Banmei2/article/details/81869724 与其说是GPRS和NB-IoT的比较,不如说是传统网络与新兴网络的比较,我 ...

  5. Python变量和常量

    1.什么是变量 变量:核心在于变和量儿字,变->变化,量->状态如何定义? x=1 变量名 变量赋值符号:= 变量值:1 其中变量名又称为标识符: 1. 可以是字母,数字,下划线的任意组合 ...

  6. PHP——敏感词过滤

    前言 如果可以用第三方的话,那么你是幸运的,因为现在这种敏感词过滤,敏感图片,敏感语音过滤的第三方服务还是挺多的 敏感词过滤 核心代码 利用PHP内置的三个函数 array_combine() | a ...

  7. Shell学习之Bash变量详解&lpar;二&rpar;

    Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...

  8. webpack创建library及从零开始发布一个npm包

    最近公司有个需求,我们部门开发一个平台项目之后,其他兄弟部门开发出的插件我们可以拿来直接用,并且不需要我们再进行打包,只是做静态的文件引入,研究一波后发现,webpack创建library可以实现. ...

  9. Javascript 中 switch case 等于 (&equals;&equals; )还是 恒等于(&equals;&equals;&equals;)?

    Javascript 中 switch case 等于 (== )还是 恒等于(===)? 可以测试一下以下代码,这个 case 中是 等于(==)还是恒等于(===) <script> ...

  10. Oracle E-Business Suite并发请求的优先级(Concurrent Request Priority)

    不少用户抱怨自己的Oracle E-Business Suite并发请求(Concurrent Request)提交了好久,但还是一直在排队,等了好久还没有执行.用户希望对于一些重要性程度高.响应要求 ...