java数据结构之实现双向链表的示例

 更新时间:2014年03月21日 09:14:14   作者:  
这篇文章主要介绍了java数据结构实现双向链表的示例,需要的朋友可以参考下

复制代码 代码如下:

/**
 * 双向链表的实现
 * @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();
  }
 }
}

相关文章

  • 使用JPA单项一对多外键关联

    使用JPA单项一对多外键关联

    这篇文章主要介绍了使用JPA单项一对多外键关联,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • java对指定目录下文件读写操作介绍

    java对指定目录下文件读写操作介绍

    本文将详细介绍java对指定目录下文件的读写功能实现,需要的朋友可以参考下
    2012-11-11
  • spring中WebClient如何设置连接超时时间以及读取超时时间

    spring中WebClient如何设置连接超时时间以及读取超时时间

    这篇文章主要给大家介绍了关于spring中WebClient如何设置连接超时时间以及读取超时时间的相关资料,WebClient是Spring框架5.0引入的基于响应式编程模型的HTTP客户端,它提供一种简便的方式来处理HTTP请求和响应,需要的朋友可以参考下
    2024-08-08
  • Java如何替换第一个和最后一个字符串

    Java如何替换第一个和最后一个字符串

    这篇文章主要介绍了Java如何替换第一个和最后一个字符串的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot整合Sa-Token实现登录认证的示例代码

    SpringBoot整合Sa-Token实现登录认证的示例代码

    本文主要介绍了SpringBoot整合Sa-Token实现登录认证的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Spring控制Bean加载顺序的操作方法

    Spring控制Bean加载顺序的操作方法

    正常情况下,Spring 容器加载 Bean 的顺序是不确定的,那么我们如果需要按顺序加载 Bean 时应如何操作?本文将详细讲述我们如何才能控制 Bean 的加载顺序,需要的朋友可以参考下
    2024-05-05
  • Struts1和struts2的区别_动力节点Java学院整理

    Struts1和struts2的区别_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Struts1和struts2的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • SpringBoot优雅的进行全局异常处理的实现步骤

    SpringBoot优雅的进行全局异常处理的实现步骤

    在软件开发的世界里,异常处理是保证系统稳定性和用户体验的关键因素之一,尤其是在构建基于微服务架构的应用时,SpringBoot提供了一套强大的工具来帮助开发者管理这些异常,所以本文给大家介绍了SpringBoot如何优雅的进行全局异常处理,需要的朋友可以参考下
    2025-02-02
  • SpringBoot实现国密SM4加密解密的使用示例

    SpringBoot实现国密SM4加密解密的使用示例

    在商用密码体系中,SM4主要用于数据加密,本文就来介绍一下SpringBoot实现国密SM4加密解密的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 分布式之全面了解Kafka的使用与特性

    分布式之全面了解Kafka的使用与特性

    Kafka 是我工作多年使用最多的消息中间件 ,特点是拥有巨大吞吐量(数百万/秒),作为当下最流行的分布式,可水平扩展,可容错的“消息系统”,下面跟随小编看下分布式之全面了解Kafka的使用与特性
    2021-11-11

最新评论