1.链表是一种重要的数据结构,在程序设计中占有很重要的地位

2.我们可以用类List来实现链表结构,用变量Head、Tail、Length、Pointer来实现表头。存储当前结点的指针时有一定的技 巧,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么为什么要这样做呢? 这是因为当删除当前结点后仍需保证剩下的结点构成链表,如果Pointer指向当前结点,则会给操作带来很大困难。那么如何得到当前结点呢,我们定义了一 个方法cursor(),返回值是指向当前结点的指针。类List还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种 操作。例如reset()方法使第一个结点成为当前结点。insert(Object d)方法在当前结点前插入一个结点,并使其成为当前结点。remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最 后一个结点,则第一个结点变为当前结点。

 /**
* 双向链表的实现
* @author Skip
* @version 1.0
*/
public class DoubleNodeList<T> {
//节点类
private static class Node<T>{
Node<T> perv; //前节点
Node<T> next; //后节点
T data; //数据 public Node(T t){
this.data = t;
}
}
private Node<T> head; //头节点
private Node<T> last; //尾节点
private Node<T> other; //备用节点存放临时操作
private int length; //链表长度 /**
* 无参构造
*/
public DoubleNodeList(){
head = new Node<T>(null);
last = head;
length = 0;
} /**
* 初始化时创建一个节点
* @param data 数据
*/
public DoubleNodeList(T data){
head = new Node<T>(data);
last = head;
length = 1;
} /**
* 添加一个节点
* @param data 添加的数据
*/
public void add(T data){
if(isEmpty()){
head = new Node<T>(data);
last = head;
length++;
}else{
//尾插法
other = new Node<T>(data);
other.perv = last;
last.next = other;
last = other;
length++;
}
} /**
* 在指定数据后插入一个节点
* @param data 指定的数据
* @param insertData 插入的数据
* @return 插入成功返回true,不成功返回false
*/
public boolean addAfert(T data , T insertData){
other = head;
while(other != null){
if(other.data.equals(data)){
Node<T> t = new Node<T>(insertData);
t.perv = other;
t.next = other.next;
other.next = t;
//判断是否在最后一个节点后添加节点
if(t.next==null){
last = t;
}
length++;
return true;
}
other = other.next;
}
return false;
} /**
* 在指定数据前插入一个节点
* @param data 指定的数据
* @param insertData 插入的数据
* @return 插入成功返回true,不成功返回false
*/
public boolean addBefore(T data, T insertData){
other = head;
while(other != null){
if(other.data.equals(data)){
Node<T> t = new Node<T>(insertData);
t.perv = other.perv;
t.next = other;
other.perv.next = t;
length++;
return true;
}
other = other.next;
}
return false;
} /**
* 获得索引处的数据
* @param index 索引
* @return 数据
*/
public T get(int index){
if(index>length || index<0){
throw new IndexOutOfBoundsException("索引越界:"+index);
}
other = head;
for(int i=0;i<index;i++){
other = other.next;
}
return other.data;
} /**
* 新值替换旧值
* @return 成功为true,未找到为false
*/
public boolean set(T oldValue,T newValue){
other = head;
while(other!=null){
if(other.data.equals(oldValue)){
other.data = newValue;
return true;
}
other = other.next;
}
return false;
} /**
* 移除指定的元素
* @param data 需要移除的元素
* @return 不存在为false,成功为true
*/
public boolean remove(T data){
other = head;
while(other != null){
if(other.data.equals(data)){
other.perv.next = other.next;
length--;
return true;
}
other = other.next;
}
return false;
} /**
* 链表中是否包含此元素
* @return 包含为true,不包含为false
*/
public boolean contains(T data){
other = head;
while(other != null){
if(other.data.equals(data)){
return true;
}
other = other.next;
}
return false;
} /**
* 获得最后一个节点的数据
* @return 最后一个节点的数据
*/
public T getLast(){
return last.data;
} /**
* 获得第一个节点的数据
* @return 第一个节点的数据
*/
public T getFirst(){
return head.data;
} /**
* 获得链表的长度
* @return 长度
*/
public int getSize(){
return length;
} /**
* 是否为空链表
* @return 空链表为true,非空链表为false
*/
public boolean isEmpty(){
return length==0;
} /**
* 清空链表
*/
public void clear(){
head = null;
length = 0;
} /**
* 输出链表内所有节点
*/
public void printList(){
if(isEmpty()){
System.out.println("空链表");
}else{
other = head;
for(int i=0;i<length;i++){
System.out.print(other.data+" ");
other = other.next;
}
System.out.println();
}
}
}

JAVA双向链表的更多相关文章

  1. Java双向链表实现

    public class DoublyLinkList { private class Data{ private Object obj; private Data left = null; priv ...

  2. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  3. JAVA单向/双向链表的实现

    一.JAVA单向链表的操作(增加节点.查找节点.删除节点) class Link { // 链表类 class Node { // 保存每一个节点,此处为了方便直接定义成内部类 private Str ...

  4. 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  5. 大话数据结构(八)Java程序——双向链表的实现

    线性链表--双向链表 双向链表定义: 双向链表(double linked list): 是在单表单的每个结点中,再设置一个指向前驱结点的指针域.因此,在双向链表中的结点都有两个指针域,一个指向前驱, ...

  6. 线性链表的双向链表——java实现

    .线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为 ...

  7. Java中双向链表的代码实现

    写在前面: 双向链表是一种对称结构,它克服了单链表上指针单向性的缺点,其中每一个节点即可向前引用,也可向后引用,这样可以更方便的插入.删除数据元素. 由于双向链表需要同时维护两个方向的指针,因此添加节 ...

  8. 双向链表--Java实现

    /*双向链表特点: *1.每个节点含有两个引用,previos和next,支持向前或向后的遍历(除头节点) *2.缺点插入或删除的时候涉及到引用修改的比较多 *注意:下面的双向链表其实也实现了双端链表 ...

  9. JAVA实现双向链表的增删功能

    JAVA实现双向链表的增删功能,完整代码 package linked; class LinkedTable{ } public class LinkedTableTest { //构造单链表 sta ...

随机推荐

  1. Understanding Execution Governors and Limits

    在编写Salesforce后台代码的时候,如果数据量比较大,或者需要与数据库的交互比较频繁的话,那么会抛出一些限制的异常,来提示你让你做进一步的修改. 有这些限制实质上是跟Salesforce是一个云 ...

  2. 在Salesforce中对某一个Object添加 Validation Rule

    在Salesforce中可以对某一个Object添加相应的 Validation Rule 来进行一个全局的条件判断,比如满足什么样的条件的修改允许提交,不满足的要提示相应的错误信息. 要创建一个Va ...

  3. cocoaPads 安装及出现Analyzing dependencies之后卡死解决方案

    1.安装 a. 查看源 gem sources -l b. 设置源: sudo gem sources -a http://ruby.taobao.org c. 删除源:sudo gem source ...

  4. 关于移动端1px边框问题

    <div class="z_nei_list"> <div class="z_name_left font-size3">身份证号:&l ...

  5. MyBatis入门案例 增删改查

    一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...

  6. 多态、类库、委托、is和as运算符、泛型集合

    多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual 重写 override 父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了v ...

  7. supervisor简介

    一什么是supervisor Superviosr是一个UNIX-like系统上的进程监控工具. Supervisor是一个Python开发的client/server系统,可以管理和监控*nix上面 ...

  8. AOP动态代理解析4-代理的创建

    做完了增强器的获取后就可以进行代理的创建了 AnnotationAwareAspectJAutoProxyCreator->postProcessAfterInitialization-> ...

  9. 学习资源asp.net

    http://www.runoob.com ajax 同一表单,多部分提交.增加,修改,删除 服务器端控件: http://technet.microsoft.com/zh-cn/library/cc ...

  10. ScriptManager和ClientScript的区别

    ClientScript获取用于管理脚本.注册脚本和向页面添加脚本的ClientScriptManager对象. ScriptManager.RegisterStartupScript方法和Clien ...