首页 > 其他 > 详细

线性表

时间:2016-05-27 00:37:24      阅读:333      评论:0      收藏:0      [点我收藏+]
 
Java内存中,栈内存和堆内存占了很大一部分空间:栈内存的存储是顺序结构,堆内存的存储是离散结构。
 

顺序表

 
技术分享
 
类成员
  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)
 
 
 
 
 
 
 





线性表

原文:http://www.cnblogs.com/Doing-what-I-love/p/5533084.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!