• 循环双链表的应用


    1.创建循环双链表节点

     1 package com.neusoft.link;
     2 /**
     3  * @author zhao-chj
     4  *双向循环链表节点类
     5  */
     6 public class DulNode {
     7     public Object data;
     8     public DulNode prior;
     9     public DulNode next;
    10     public DulNode() {//无参构造函数
    11         this(null);
    12     }
    13     public DulNode(Object data) {//构造值为data的节点
    14         this.data=data;
    15         this.prior=null;
    16         this.next=null;
    17     }
    18 }

    2.循环双链表的各种操作

      1 package com.neusoft.link;
      2 
      3 import java.util.Scanner;
      4 
      5 import com.neusoft.List.IList;
      6 
      7 public class DulList implements IList {
      8     public DulNode head;
      9     public DulNode getHead() {
     10         return head;
     11     }
     12     public void setHead(DulNode head) {
     13         this.head = head;
     14     }
     15     public DulList() {
     16         // TODO 构造方法初始化头结点及前驱和后继
     17         head=new DulNode();
     18         head.prior=head;//head的前驱指向head
     19         head.next=head;//head的后继指向head
     20     }
     21     /**
     22      * 创建从表尾到表头逆向建立双向链表的算法。n为双向链表元素的个数
     23      * @param n
     24      */
     25     public DulList(int n){
     26         this();
     27         System.out.println("请您输入双向链表的元素~");
     28         Scanner sc = new Scanner(System.in);
     29         for (int i = 0; i < n; i++) {
     30             insert(0, sc.next());//生成新节点插入到表头
     31         }
     32     }
     33     @Override
     34     public void clear() {
     35         // TODO 置空
     36         head.prior=head;
     37         head.next=head;
     38     }
     39     @Override
     40     public boolean isEmpty() {
     41         // TODO 判空,head=head.next时候即为空
     42         return head.equals(head.next);
     43     }
     44     @Override
     45     public int length() {
     46         // TODO 求长度
     47         DulNode p=head.next;
     48         int length=0;
     49         while (!p.equals(head)) {//判断是否为空
     50             p=p.next;
     51             length++;
     52         }
     53         return length;
     54     }
     55 
     56     @Override
     57     public Object get(int i) {
     58         // TODO 读取循环双链表的第i个数据元素
     59         DulNode p=head.next;
     60         int j=0;
     61         while (!p.equals(head)) {
     62             p=p.next;
     63             j++;
     64         }
     65         if (j>i||p.equals(head)) {
     66             System.out.println("查找元素不存在");
     67         }
     68         return p.data;
     69     }
     70 
     71     @Override
     72     public void insert(int i, Object x) {
     73         // TODO 在双向循环链表的第i个数据元素之前插入一个值为x的节点,
     74         //i等于表长时候,p指向头结点;i>表长时候,p=null
     75         DulNode p=head.next;
     76         int j=0;
     77         while (!p.equals(head)&&j<i) {//寻找插入位置i
     78             p=p.next;
     79             j++;
     80         }
     81         if (j!=i&&!p.equals(head)) {
     82             System.out.println("插入位置不合法");
     83         }
     84         DulNode s=new DulNode(x);
     85         p.prior.next=s;
     86         s.prior=p.prior;
     87         s.next=p;
     88         p.prior=s;
     89     }
     90     @Override
     91     public void remove(int i) {
     92         // TODO 删除双链表的第i个数据元素。注意长度取值
     93         DulNode p = head.next;
     94         int j=0;
     95         while (!p.equals(head)&&j<i) {//寻找第i个元素
     96             p=p.next;
     97             j++;
     98         }
     99         if (j!=i) {
    100             System.out.println("删除位置不合理");
    101         }
    102         p.prior.next=p.next;
    103         p.next.prior=p.prior;
    104     }
    105 
    106     @Override
    107     public int indexOf(Object x) {
    108         // TODO 在循环双链表中查找值为x的元素,找到返回其位置
    109         DulNode p = head.next;
    110         int j=0;
    111         while (!p.equals(head)&&!p.data.equals(x)) {
    112             p=p.next;
    113             j++;
    114         }
    115         if (!p.equals(head)) {
    116             return j;//返回其位置
    117         }else {
    118             System.out.println("不存在该元素");
    119             return -1;
    120         }
    121     }
    122 
    123     @Override
    124     public void display() {
    125         // TODO 显示循环双链表
    126         DulNode p = head.next;
    127         while (!p.equals(head)) {
    128             System.out.print(p.data+" ");
    129             p=p.next;
    130         }
    131         System.out.println();
    132     }
    133 
    134     @Override
    135     public int remove(Object i) {
    136         // TODO Auto-generated method stub
    137         return 0;
    138     }
    139 
    140 }

    3.测试循环双链表类

     1 package com.neusoft.link;
     2 /**
     3  * @author zhao-chj
     4  * 循环双链表的测试
     5  */
     6 public class DebugDuList {
     7     public static void main(String[] args) {
     8         //-------调用构造方法----------------
     9         System.out.println("************执行构造方法**************");
    10         System.out.println("请您输入3个双向循环链表的数据元素");
    11         DulList L = new DulList(3);
    12         System.out.println("双向循环链表中各个数据元素~");
    13         L.display();
    14         //-------调用length()求顺序表的长度-----
    15         System.out.println("************执行length()方法**************");
    16         System.out.println("双向循环链表的长度为:"+L.length());
    17         //-------调用get(int i)取出第i个元素---------
    18         System.out.println("************执行get(int i)方法**************");
    19         if (L.get(2)!=null) {
    20             System.out.println("双向循环链表中第2个元素为:"+L.get(2));
    21         }else {
    22             System.out.println("双向循环链表中第2个元素不存在");
    23         }
    24         //-------调用indexOf(Object x)查找x元素所在的位置-------
    25         System.out.println("************执行indexOf(Object x)方法**************");
    26         int order = L.indexOf("c");
    27         if (order !=-1) {
    28             System.out.println("双向循环链表中字符串为c的数据元素位置:"+order);
    29         }else {
    30             System.out.println("字符'c'不在促双向循环链表中");
    31         }
    32         //------remove(int i)删除数据元素------
    33         System.out.println("************执行remove(int i)方法**************");
    34         L.remove(2);
    35         System.out.println("删除第2个位置的数据之后双向循环链表的个个数据元素为:");
    36         L.display();
    37         //----insert(int i,Object x)插入数据元素----------
    38         System.out.println("************执行insert(int i,Object x)方法**************");
    39         L.insert(2, 'd');
    40         System.out.println("在2的位置上插入数据元素d之后双向循环链表的各个元素为:");
    41         L.display();
    42         //------调用L.clear()将顺序置空-------
    43         System.out.println("************执行L.clear()方法**************");
    44         L.clear();
    45         System.out.println("将双向循环链表置空之后再打印数据元素:");
    46         //-------isEmpty()判空操作-----------
    47         System.out.println("************执行isEmpty()方法**************");
    48         if (L.isEmpty()) {
    49             System.out.println("双向链表为空");
    50         }else {
    51             System.out.println("双向链表不为空,双向循环链表的各个元素为:");
    52             L.display();
    53         }
    54         System.out.println("************END**************");
    55     }
    56 }

    4.循环双链表测试

          

  • 相关阅读:
    用 Flask 来写个轻博客
    Django 博客开发教程目录索引
    动态规划问题
    Java课程目录
    React&Vue
    Node.js
    Chrome Input框老是有输入记录的终极解决方案
    php中&运算符的理解与使用
    服务器压测、并发数、配置与资源消耗的关系研究
    定时任务被执行两遍,如何处理?
  • 原文地址:https://www.cnblogs.com/jackchen-Net/p/6591598.html
Copyright © 2020-2023  润新知