java基础-双向循环链表

简介: java基础-双向循环链表

正文


前文介绍了java基础-链表


双向循环链表就是链表的升级版,多了有头,尾指针之分,指针的方向是双向的!!!


首先创一个节点类:


package cn.itcast.huahai.linklist;
//AnyType表示任意类型
public class DulNode<AnyType>{
  public AnyType data;//数值
  public DulNode<AnyType> next;//前驱节点
  public DulNode<AnyType> prior;//后继节点
  //初始化
  public DulNode() {
    this(null);
  }
  public DulNode(AnyType data) {
        this.data=data;
        this.prior=null;
        this.next=null;
  }
}


创建一个接口类:


package cn.itcast.huahai.linklist;
/*
 * 双向循环链表
 */
public interface IList<AnyType> {
  public void addDulNode(AnyType x)throws Exception;//添加元素的方法
  public void removeDulNode(int i)throws Exception;//移出元素的方法
  public AnyType getDulNode(int i)throws Exception;//获取元素的方法
  public int indexOfDulNode(AnyType x);//查找元素的方法
  public void clearDulNode();//置空元素的方法
  public boolean isEmptyDulNode();//判断空元素的方法
  public void displayDulNode();//打印元素的方法
  public int length();//元素长度的方法
}


实现接口的所有方法:


package cn.itcast.huahai.linklist;
public class DulLinkList<AnyType> implements IList<AnyType>{
    public DulNode<AnyType> beginMarker;//头指针
    public DulNode<AnyType> endMarker;//尾指针
    //初始化
    public DulLinkList() {
      beginMarker=new DulNode<AnyType>();
      endMarker=new DulNode<AnyType>();
      beginMarker.prior=endMarker;
      beginMarker.next=null;
      endMarker.prior=null;
        endMarker.next=beginMarker;  
    }
  public void addDulNode(AnyType x) throws Exception {
    DulNode<AnyType> node=new DulNode<AnyType>(x);
    if(beginMarker.next==null) {
      beginMarker.next=node;
      node.prior=beginMarker;
    }else {
      endMarker.next=node;
      node.prior=endMarker;
    }
    endMarker=node;
    endMarker.next=beginMarker;
    beginMarker.prior=endMarker;
  }
  public void removeDulNode(int i) throws Exception {
    DulNode<AnyType> p=beginMarker.next;
    int j=0;
    while(!beginMarker.equals(p)&&j<i) {
      j++;
      p=p.next;
    }
    p.prior.next=p.next;
    p.next.prior=p.prior;
  }
  public AnyType getDulNode(int i) throws Exception {
    DulNode<AnyType> p=beginMarker.next;
    int j=0;
    while(!beginMarker.equals(p)&&j<i) {
      j++;
      p=p.next;
    }
    return p.data;
  }
  public int indexOfDulNode(AnyType x) {
    DulNode<AnyType> p=beginMarker.next;
    int j=0;
    while(!beginMarker.equals(p)&&!x.equals(p.data)) {
      j++;
      p=p.next;
    }
    if(!beginMarker.equals(p))
      return j;
    else
      return -1;
  }
  public void clearDulNode() {
    beginMarker.next=null;
      endMarker.prior=null;
  }
  public int length() {
      DulNode<AnyType> p=beginMarker.next;
    int length=0;
    while(!beginMarker.equals(p)) {
      length++;
      p=p.next;
    }
    return length;
  }
  public boolean isEmptyDulNode() {
    return beginMarker.next==null;
  }
  public void displayDulNode() {
    DulNode<AnyType> p=beginMarker.next;
      while(!beginMarker.equals(p)){
       System.out.print(p.data+" ");
       p=p.next;
     }
     System.out.println();
  }
  public static void main(String[] args) throws Exception {
    long begintime=System.currentTimeMillis();
    Thread.currentThread();
    Thread.sleep(1);//睡眠1毫秒
    DulLinkList<Object> L=new DulLinkList<Object>();
    for (int i = 0; i < 10; i++) {
      L.addDulNode(i);//插入元素
    }
    long endtime=System.currentTimeMillis();
    //L.clearDulNode();//置空元素
    if(L.isEmptyDulNode()){
      System.out.println("非常抱歉,链表为空.");
        System.out.println("耗时:"+(endtime-begintime-1)+"毫秒.");
    }else{
      System.out.print("双向循坏链表:");
        L.displayDulNode();
        System.out.println("双向循坏链表的元素长度:"+L.length());//元素长度
      System.out.println("双向循坏链表移出的元素:0");//移出元素
      L.removeDulNode(0);
      System.out.print("双向循坏链表:");
        L.displayDulNode();
        System.out.println("双向循坏链表的元素长度:"+L.length());//元素长度
        System.out.println("双向循坏链表的元素为'1'的索引:"+L.indexOfDulNode(1));//查找元素
        System.out.println("双向循坏链表的索引为1的元素:"+L.getDulNode(1));
        System.out.println("耗时:"+(endtime-begintime-1)+"毫秒.");//消耗时间
    }   
    }
}


运行结果:


111.png


目录
相关文章
|
15天前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
Java循环操作哪个快?
|
3月前
|
存储 Java
|
1月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
73 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
30天前
|
算法 Java 测试技术
🧑‍💻Java零基础:Java 的循环退出语句 break
【10月更文挑战第16天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
47 6
|
1月前
|
Java 测试技术 数据安全/隐私保护
📖Java零基础-while循环语句的深度解析
【10月更文挑战第6天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
31 1
|
1月前
|
传感器 Java 测试技术
📖Java零基础-do-while循环语句的深入剖析
【10月更文挑战第5天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
18 1
|
2月前
|
Java
java基础(2)循环语句for、while、do...while
本文介绍了Java中的基础循环语句,包括for循环、while循环和do...while循环。文章通过示例代码展示了for循环的基本结构和用法,while循环的先判断后执行逻辑,以及do...while循环的先执行后判断逻辑。这些循环语句在Java编程中非常常用,用于执行重复的任务。
51 4
java基础(2)循环语句for、while、do...while
|
2月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
25 3
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
下一篇
无影云桌面