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


目录
相关文章
|
3月前
|
Java
Java编程:理解while循环的使用
总结而言, 使用 while 迴圈可以有效解决需要多次重复操作直至特定條件被触发才停止執行任务场景下问题; 它简单、灵活、易于实现各种逻辑控制需求但同时也要注意防止因邏各错误导致無限迁璇発生及及時處理可能発生异常以确保程序稳定运作。
344 0
|
8月前
|
传感器 安全 Java
《从头开始学java,一天一个知识点》之:循环结构:for与while循环的使用场景
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白
236 22
|
10月前
|
Java
Java快速入门之判断与循环
本文介绍了编程中的流程控制语句,主要包括顺序结构、判断结构(if语句和switch语句)以及循环结构(for、while和do...while)。通过这些语句可以精确控制程序的执行流程。if语句有三种格式,分别用于简单条件判断、二选一判断和多条件判断。switch语句适用于有限个离散值的选择判断,而循环结构则用于重复执行某段代码,其中for循环适合已知次数的情况,while循环适合未知次数但有明确结束条件的情况,do...while则是先执行后判断。文中还提供了多个示例和练习,帮助读者理解并掌握这些重要的编程概念。
|
存储 Java
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
267 5
Java循环操作哪个快?
|
12月前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中stream API与传统for循环在性能上的对比,通过多个示例分析了不同场景下两者的优劣。作者指出,尽管stream API使代码更简洁,但不当使用会降低可读性和性能,特别是在处理大数据量时。实验结果显示,在多数情况下,普通for循环的性能优于stream API,尤其是在单次操作耗时较短但需多次执行的场景中。文章建议开发者在设计初期就考虑全局流程,避免重复使用stream流,以提升代码质量和性能。
298 1
Java循环操作哪个快?
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
345 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
Java
java基础(2)循环语句for、while、do...while
本文介绍了Java中的基础循环语句,包括for循环、while循环和do...while循环。文章通过示例代码展示了for循环的基本结构和用法,while循环的先判断后执行逻辑,以及do...while循环的先执行后判断逻辑。这些循环语句在Java编程中非常常用,用于执行重复的任务。
185 4
java基础(2)循环语句for、while、do...while
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现