zoukankan      html  css  js  c++  java
  • 线性表

     
    Java内存中,栈内存和堆内存占了很大一部分空间:栈内存的存储是顺序结构,堆内存的存储是离散结构。
     

    顺序表

     
    d3384f05-39d1-46d9-a580-bf4b531d740c
     
    类成员
    1. int maxSize;                      //最大长度
    2. int size;                         //当前长度
    3. Object[] listArray;               //对象数组
     
    类主要方法
    删除
    移动元素时,要从前往后操作。
    1. publicvoiddelete(int index) throws Exception
    2. {
    3.         //容错性
    4.         if(isEmpty()){
    5.             thrownewException("顺序表为空,无法删除!");
    6.         }
    7.         if(index <0|| index > size -1){
    8.             thrownewException("参数错误!");
    9.         }
    10.  
    11.         //移动元素(从前往后操作)
    12.         for(int j = index; j < size -1; j++)
    13.             listArray[j]= listArray[j +1];
    14.  
    15.         listArray[size -1]= null;      //注意释放内存(避免内存泄漏)
    16.         size--;
    17. }
     
    插入
    移动元素时,要从后往前操作,不能从前往后操作,不然元素会被覆盖的。
    1. publicvoid insert(int index,Object obj) throws Exception
    2. {
    3.         //容错性
    4.         if(size == maxSize){
    5.             thrownewException("顺序表已满,无法插入!");
    6.         }
    7.         if(index <0|| index > size){
    8.             thrownewException("参数错误!");
    9.         }
    10.  
    11.         //移动元素(从后往前操作)
    12.         for(int j = size -1; j >= index; j--)
    13.             listArray[j +1]= listArray[j];
    14.  
    15.         listArray[index]= obj;
    16.         size++;
    17.  }
     

    单向链表

    • 带头结点:(操作统一,推荐)
     
    • 不带头结点:
     
    类成员
    1.  //结点类
    2.     publicclassNode{
    3.         publicObject data;
    4.         publicNode next;
    5.  
    6.         publicNode(Object obj,Node next){
    7.             this.data = obj;
    8.             this.next = next;
    9.         }
    10.     }
    11.  
    12.     Node head;          //记录头结点信息即可(头结点下标为-1)
    13.     int size;
     
     
    类主要方法
    定位
    1.  //定位
    2.     publicNode locate(int index) throws Exception
    3.     {
    4.         //容错性
    5.         if(index <-1|| index > size)
    6.             thrownewException("参数错误!");
    7.  
    8.         //定位到temp指向第index个(index为下标)
    9.         Node temp = head;
    10.         for(int i =-1; i < index; i++)
    11.             if(temp != null)
    12.                 temp = temp.next;
    13.  
    14.         return  temp;
    15.     }
     
    删除
    1. publicvoiddelete(int index) throws Exception
    2.     {
    3.         //容错性
    4.         if(isEmpty())
    5.             thrownewException("链表为空,无法删除!");
    6.         if(index <0|| index > size -1)
    7.             thrownewException("参数错误!");
    8.  
    9.         Node temp = locate(index -1);                        //定位到要操作结点的前一个结点对象
    10.         temp.next = temp.next.next;
    11.         size--;
    12.     }
     
    插入
    1. publicvoid insert(int index,Object obj) throws Exception
    2.     {
    3.         //容错性
    4.         if(index <0|| index > size )
    5.             thrownewException("参数错误!");
    6.  
    7.         Node temp = locate(index -1);                        //定位到要操作结点的前一个结点对象
    8.         Node p =newNode(obj,temp.next);
    9.         temp.next = p;
    10.         size++;
    11.     }
     

    双向链表

    类成员
    1.  //结点类
    2.     publicclassNode{
    3.  
    4.         publicObject data;
    5.         publicNode next;
    6.         publicNode prior;
    7.  
    8.         publicNode(Object obj,Node next,Node prior){
    9.             this.data = obj;
    10.             this.next = next;
    11.             this.prior = prior;
    12.         }
    13.     }
    14.  
    15.     Node head;          //记录头结点信息即可(头结点下标为-1)
    16.     int size;
     
    类主要方法
    定位
    1.  //定位
    2.     publicNode locate(int index) throws Exception
    3.     {
    4.         //容错性
    5.         if(index <-1|| index > size)
    6.             thrownewException("参数错误!");
    7.  
    8.         //定位到temp指向第index个(index为下标,从0开始)
    9.         Node temp = head;
    10.         for(int i =-1; i < index; i++)
    11.             if(temp != null)
    12.                 temp = temp.next;
    13.  
    14.         return  temp;
    15.     }
     
    删除
    1.  publicvoiddelete(int index) throws Exception{
    2.  
    3.         if(isEmpty())
    4.             thrownewException("链表为空,无法删除!");
    5.  
    6.         if(index <0|| index > size -1)
    7.             thrownewException("参数错误!");
    8.  
    9.         Node temp = locate(index -1);               //定位到要操作结点的前一个结点对象
    10.         temp.next = temp.next.next;
    11.         if(temp.next != null)                     //当删除到最后一个元素:temp.next == null
    12.             temp.next.prior = temp;
    13.         size--;
    14.     }
     
    插入
     
    1.  publicvoid insert(int index,Object obj) throws Exception{
    2.         //容错性
    3.         if(index <0|| index > size )
    4.             thrownewException("参数错误!");
    5.  
    6.         Node temp = locate(index -1);               //定位到要操作结点的前一个结点对象
    7.         Node p =newNode(obj,temp.next,temp);
    8.         temp.next = p;
    9.         if(p.next != null)                       //当插入到最后一个位置:p.next == null
    10.             p.next.prior = p;
    11.         size++;
    12.     }
     

    循环单向链表

    空:
    非空:
     

    循环双向链表


    静态链表


    顺序表与链表比较

    顺序表
    • 优点:
    支持随机读取O(1)
    • 缺点:
    1.  插入删除操作平均移动大约表中一半的元素,对n较大的顺序表效率低。(移动元素涉及内存的写入,消耗较大)
    2.  需要预先分配足够大的存储空间:估计过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。
     
    链表
    优点:
    1. 不需要预先给出数据元素的最大个数
    2. 插入和删除操作时不需要移动数据元素
    缺点:
    不支持随机读取,单链表取数据元素操作的时间复杂度为O(n)
     
     
     
     
     
     
     





  • 相关阅读:
    hbase删除标记和注意事项
    马上拥有一台自己的云服务器
    在 Ubuntu 开启 GO 程序编译之旅
    在 Ubuntu 上安装 Protobuf 3
    功能设计中技术人员之惑
    关于数据可视化页面制作
    快速响应请求浅谈
    自定义一个代码耗时计数工具类
    一种极简的异步超时处理机制设计与实现(C#版)
    百度地图API图标、文本、图例与连线
  • 原文地址:https://www.cnblogs.com/Doing-what-I-love/p/5533084.html
Copyright © 2011-2022 走看看