Java自己实现双向链表LinkList
/**
* <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的更多相关文章
- Java实现一个双向链表的倒置功能
题目要求:Java实现一个双向链表的倒置功能(1->2->3 变成 3->2->1) 提交:代码.测试用例,希望可以写成一个Java小项目,可以看到单元测试部分 该题目的代码, ...
- java集合系列之LinkList
概要 第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45) 第5部分 LinkedList示例 转载请注明出处 ...
- JAVA实现单双向链表的增、删、改、查
单向链表 package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { public static vo ...
- Java 数据结构之双向链表
一.概述: 1.什么是双向链表: 链表中的每个节点即指向前面一个节点,也指向后面一个节点,就像丢手绢游戏一样,每个人都手拉手 2.从头部插入 要对链表进行判断,如果为空则设置尾节点为新添加的节点,如果 ...
- JAVA数据结构--LinkedList双向链表
链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分: ...
- java数据结构-05双向链表
一.双向链式存储: ①简述:要是节点中包含两个指针部分,一个指向前驱元,一个指向后继元,Java中LinkedList集合类的实现就是双向链表 (以下图片为网络收集,侵删) ②特点:数据是非连续的,链 ...
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- 图解Java数据结构之双向链表
上一篇文章说到了单链表,也通过案例具体实现了一下,但是单链表的缺点也显而易见. 单向链表查找的方向只能是一个方向 单向链表不能自我删除,需要靠辅助节点 而双向链表则能够很轻松地实现上面的功能. 何为双 ...
- Java数据结构之双向链表
管理单向链表的缺点分析: 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找. 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找 ...
随机推荐
- css3 border-radius
前缀对应浏览器 前缀 浏览器 -webkit chrome和safari -moz firefox -ms IE -o opera border-radius: <style type=&quo ...
- 2015 Selenium大会
9月8号到10号三天在俄勒冈州的波特兰召开了Selenium Conference 2015,分享的演讲很多,视频也放出来了,做了下搬运工,传到优酷 简介: A conference that bri ...
- Android开发中上线后修改应用名称的若干问题
一.在Android Studio 1.3中修改app的包名: 需求来源: 之前开发的app已经在腾讯的应用宝上线,应客户要求,app需要改名字,这个就有点麻烦了.如果申请改名字,要求如下: 截图上图 ...
- vijos1334 NASA的食物计划(二维费用的背包问题)
背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力下终止了航天 飞机的历史,但是此类事情会不会在以后发生,谁也无法 保证,在遇到这类航天问题时,解决方 ...
- 判断一个变量的类型Object.prototype.toString.call
var num = 1;alert(Object.prototype.toString.call(num)); // [object Number]var str = 'hudidit.com';al ...
- 针对苹果最新审核要求为应用兼容IPv6
在WWDC2015上苹果宣布iOS9将支持纯IPv6的网络服务.2016年初开始所有提交到App Store的应用必须支持IPv6.为确保现有的应用是兼容的,我们需要注意下面几点. 不建议使用底层的网 ...
- 职责链(Chain of Responsibility)模式在航空货运中的运用实例
设计模式这东西,基本上属于“看懂一瞬间,用会好几年”.只有实际开发中,当某一模式很好的满足了业务需求时,才会有真切的感觉.借用一句<闪电侠>中,绿箭侠教导闪电侠的台词:“不是你碰巧遇到了它 ...
- JAVA CDI 学习(2) - Scope 生命周期
在上一节中,我们已经知道了如何用@Inject实现基本注入,这一节研究Bean实例注入后的“生命周期”,web application中有几种基本的生命周期(不管哪种编程语言都类似) 1.Applic ...
- MVC5 + EF6 + Bootstrap3 (15) 应用ModelState和Data Annotation做服务器端数据验证
Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-server-side-validation.html 系列 ...
- lecture7-序列模型及递归神经网络RNN
Hinton 第七课 .这里先说下RNN有recurrent neural network 和 recursive neural network两种,是不一样的,前者指的是一种人工神经网络,后者指的是 ...