• 关于JAVA数据结构_线性表(通过双向链表实现)的学习


    list接口:

     1 package demo1;
     2 
     3 public interface MyList {
     4 
     5     int getSize();//返回线性表中元素的个数
     6     boolean isEmpty();//判断线性表是否为空
     7     void insert(int i,Object e);//在线性表的i索引值添加元素e
     8     boolean contains(Object e);//判断线性表中元素e的索引值
     9     int indexOf(Object e);//返回线性表中元素e的索引值
    10     Object remove(Object e);//删除线性表第一个与e相同的元素,并返回该元素
    11     Object remove(int i);//删除线性表第一个与i相同的元素,并返回该元素
    12     Object replace(int i,Object e);//使用元素e代替i,并返回就得元素
    13     Object get(int i);//返回索引值为i的元素
    14     boolean insertBefore(Object p,Object e);//在线性表元素p前面插入元素e
    15     boolean insertAfter(Object p,Object e);//在线性表元素p后面插入元素e
    16     
    17 
    18 }

    通过双向链表实现:

      1 package demo1;
      2 /**
      3  * 双向列表
      4  * @author ASUS
      5  *
      6  */
      7 public class MyDualLinkedList implements MyList {
      8     private Node first;  //指向前结点
      9     private Node last;  //指向尾结点
     10     private int size;   //保存元素的个数
     11     
     12     //返回元素的个数
     13     @Override
     14     public int getSize() {
     15 
     16         return size;
     17     }
     18 
     19     //判断链表是否为空
     20     @Override
     21     public boolean isEmpty() {
     22 
     23         return size==0;
     24     }
     25 
     26     //在指定位置插入元素
     27     @Override
     28     public void insert(int i, Object e) {
     29         //1.检查索引是否越界
     30         checkIndex(i);        
     31         //2.如果i==0;
     32         if(i==0){
     33             addFirst(e);
     34         }else if(i==size){
     35         //3.如果i==size,在尾部添加
     36             addLast(e);
     37         }else{
     38         //4.列表中心添加
     39             //找到i结点,在i结点前面插入元素
     40             Node pNode=getNode(i);
     41             Node PrevNode=pNode.prev;
     42             //生成新的结点
     43             Node newNode=new Node(e, PrevNode, pNode);
     44             //修改前驱结点的后缀
     45             
     46             PrevNode.next=newNode;
     47             pNode.prev=newNode;
     48             size++;
     49             
     50             
     51         }
     52     }
     53 
     54     //返回索引值对应的结点
     55     private Node getNode(int i) {
     56         //
     57         Node pNode=first;
     58         for(int x=0;x<i;x++){
     59             pNode=pNode.next;
     60         }
     61         return pNode;
     62     }
     63 
     64     
     65     //判断链表中是否包含指定的元素e,如果存在返回true
     66     @Override
     67     public boolean contains(Object e) {
     68 
     69         return indexOf(e)>=0;
     70     }
     71 
     72     //判断元素e在链表中第一次出现的位置,如果不存在返回-1
     73     @Override
     74     public int indexOf(Object e) {
     75         int i=0;
     76         //依次遍历链表中各个结点,比较结点的元素与指定的e是否一样
     77         if(e==null){
     78             for(Node pNode=first;pNode!=null;pNode=pNode.next){
     79                 if(pNode.data==null){
     80                     return i;
     81                 }
     82                 i++;
     83             }
     84         }else{
     85             for(Node pNode=first;pNode!=null;pNode=pNode.next){
     86                 if(e.equals(pNode.data)){
     87                     return i;
     88                 }
     89                 i++;
     90             }
     91             
     92         }
     93         return -1;
     94     }
     95     
     96     //从链表中删除指定元素,并返回删除元素
     97     @Override
     98     public Object remove(Object e) {
     99         //找到元素e对应的元素
    100         int index=indexOf(e);
    101         if(index<0){
    102             return null;
    103         }
    104         return remove(index);
    105     }
    106 
    107     //从链表中删除指定索引的元素,并返回删除的元素
    108     @Override
    109     public Object remove(int i) {
    110         //判断索引值是否越界
    111         checkIndex(i);
    112         //找到对应的结点
    113         Node pNode=getNode(i);
    114         Node prevNode=pNode.prev;
    115         Node nextNode=pNode.next;
    116         if(prevNode==null){
    117             //删除头结点
    118             first=nextNode;
    119         }else{
    120             prevNode.next=nextNode;
    121         }
    122         if(nextNode==null){
    123             //删除尾结点
    124             last=prevNode;
    125         }else{
    126             nextNode.prev=prevNode;
    127             
    128         }
    129         size--;
    130         return pNode.data;
    131     }
    132 
    133     //修改指定索引值得元素
    134     @Override
    135     public Object replace(int i, Object e) {
    136         //检查是否越界
    137         checkIndex(i);
    138         //找到索引值为i的结点
    139         Node pNode=getNode(i);
    140         Object old =pNode.data;
    141         pNode.data=e;
    142         
    143         
    144         return old;
    145     }
    146 
    147     //返回线性表中i索引值的元素
    148     @Override
    149     public Object get(int i) {
    150         //判断是否越界
    151         checkIndex(i);
    152         Node pNode=getNode(i);
    153          return pNode.data;
    154     }
    155 
    156     
    157     //在指定元素p前面插入元素e
    158     @Override
    159     public boolean insertBefore(Object p, Object e) {
    160         //找到p元素在链表中的位置
    161         int index =indexOf(p);
    162         if(index<0){
    163             return false;
    164         }
    165         insert(index,e);
    166         return true;
    167     }
    168     //在指定元素p后面插入元素e
    169     @Override
    170     public boolean insertAfter(Object p, Object e) {
    171         int index=indexOf(p);
    172         if(index<0){
    173             return false;
    174         }
    175         insert(index+1,e);
    176         return true;
    177     }
    178     //检查索引值是否越界
    179         private void checkIndex(int i){
    180             if(i<0||i>size){
    181                 throw new IndexOutOfBoundsException(i+"越界");
    182             }
    183         }
    184         
    185         @Override
    186         public String toString() {
    187             //依次遍历各个结点,吧元素转化为字符串
    188             StringBuilder sb=new StringBuilder();
    189             sb.append("[");
    190             for(Node node=first;node!=null;node=node.next){
    191                 sb.append(node.data);
    192                 if(node!=last){
    193                     sb.append(",");
    194                     
    195                 }
    196             }
    197             sb.append("]");
    198             return sb.toString();
    199         }
    200        //常用对头结点和尾结点的操作
    201         //在头部添加元素
    202         public void addFirst(Object e){
    203             Node pNode = first;
    204             //生成一个新的结点
    205             Node newNode=new Node(e,null,first);
    206                 first = newNode;   //修改first指向新的结点
    207                 if(pNode==null){
    208                     last=newNode;
    209                 }else{
    210                     pNode.prev=newNode;
    211                 }
    212                 size++;  //元素个数加一
    213             }
    214         //在尾部添加
    215         public void addLast(Object e){
    216             Node pNode=last;
    217             //生成一个新的结点
    218             Node newNode=new Node(e,last,null);
    219             if(pNode==null){
    220                 first=newNode;
    221             }else{
    222                 pNode.next=newNode;
    223             }
    224             last=newNode;
    225             size++;            
    226         }
    227         //删除第一个元素,删除头元素
    228         public Object removeFirst(){
    229             return remove(0);
    230         }
    231         //删除最后一个元素,尾元素
    232         public Object removeLast(){
    233             return remove(size-1);
    234         }
    235         //返回头元素
    236         public Object getFirst(){
    237             return get(0); 
    238         }
    239         //返回尾元素
    240         public Object getLast(){
    241             return get(size-1);
    242         }
    243         
    244     //定义一个内部类描述双向列表的结点
    245     private class Node{
    246         Object data;
    247         Node prev;   //指向前驱结点
    248         Node next;   //指向后续结点
    249         public Node(Object data, Node prev, Node next) {
    250             super();
    251             this.data = data;
    252             this.prev = prev;
    253             this.next = next;
    254         }
    255         
    256         
    257     }
    258 }

    测试类:

     1 package demo1;
     2 /**
     3  * 测试双向列表
     4  * @author ASUS
     5  *
     6  */
     7 public class TestDualLinkedList {
     8 
     9     public static void main(String[] args) {
    10         //创建双向列表
    11         MyDualLinkedList linkedList=new MyDualLinkedList();
    12         
    13         System.out.println(linkedList.getSize());
    14         System.out.println(linkedList.isEmpty());
    15         
    16         linkedList.insert(0,"gg");
    17         linkedList.insert(0,"jj");
    18         linkedList.insert(1,"dd");
    19         linkedList.insert(2,"mm");
    20         
    21         System.out.println(linkedList);
    22         System.out.println("-------------------");
    23         //测试是否包含某个元素及第一次出现的位置
    24         System.out.println(linkedList.indexOf("jj"));
    25         System.out.println(linkedList.contains("mm"));
    26         System.out.println(linkedList.indexOf("MM"));
    27         System.out.println(linkedList.indexOf("xx"));
    28         System.out.println(linkedList.indexOf("gg"));
    29         System.out.println("-------------------");
    30         //删除指定的元素
    31         System.out.println(linkedList.remove(1));
    32         System.out.println(linkedList);
    33         System.out.println(linkedList.remove("mm"));
    34         System.out.println(linkedList);
    35         System.out.println("-------------------");
    36         //替换指定元素
    37         System.out.println(linkedList.replace(0, "哈哈"));
    38         System.out.println(linkedList);
    39         //返回指定元素的
    40         System.out.println(linkedList.get(0));
    41         System.out.println("-------------------");
    42         
    43         //在指定元素前面加入
    44         System.out.println(linkedList.insertBefore("哈哈", "前面"));
    45         System.out.println(linkedList);
    46         //后面
    47         System.out.println(linkedList.insertAfter("哈哈", "后面"));
    48         System.out.println(linkedList);
    49         System.out.println("--------------------");
    50         //头部尾部添加删除返回
    51         linkedList.addFirst("头部");
    52         linkedList.addLast("尾部");
    53         System.out.println(linkedList);
    54         System.out.println(linkedList.getFirst());
    55         System.out.println(linkedList.getLast());
    56         //删除头部尾部
    57         linkedList.removeFirst();
    58         linkedList.removeLast();
    59         System.out.println(linkedList);
    60     
    61     }
    62 
    63}
     

    运行截图:

  • 相关阅读:
    Redis 之服务器集群配置
    Redis 之持久化(rdb、aof)
    Redis 之消息发布与订阅(publish、subscribe)
    Redis事物及锁的运用
    Redis 之hash集合结构及命令详解
    对Ul下的li标签执行点击事件——如何获取你所点击的标签
    .net 面试题(3)
    SQL Server 系统时间
    分布式内存对象缓存 memcached
    MVC 模板页和布局
  • 原文地址:https://www.cnblogs.com/yumu77/p/13752281.html
Copyright © 2020-2023  润新知