动态数组和链表的各自特点及区别

看到这个标题,同学们应该知道,博主发的这篇博客讲的什么(目前属于新手小白,如有错误的或者漏失的,还请各位读者大大补充呦)

首先我们先说说这两者的各自特点吧

一.动态数组的特点

动态数组看名称我们也知道它属于数组的,所以数组的特点,他基本也都有。比如连续空间存储,单个存储空间大小不可更改,通过索引能够直接查找元素等,除此之外,他还有它本身的特性,顾名思义就是他的动态性,能够根据要存储元素的不同,自动扩大数组的存储容量。

下面是具体的特性。

1.连续空间存储(容易查找元素,访问元素速度快):连续空间存储是一种数据存储方式,它将信息以连续的方式存储在物理介质上,确保数据在存储空间中的物理位置是相邻的。

2.单个元素存储空间固定。

3.能够通过索引直接查找元素。

4.动态性:自动调整数组的大小。(区别于一般数组)

缺点

1.要求存储空间的连续性。(不能有效利用碎片内存空间和不适合存储超大量的元素)

2.扩容数组时,计算机花费的代价较大。(复制原来数组的元素)

3.元素的插入或者删除不方便。(需要移动大量的元素)

动态数组添加元素时的代码如下

public void add(int data){
    //判断是否需要库容
    if(size == arr.length){
        //扩容数组
        int[] nArr = new int[arr.length*2];
        //复制原数组数据到新数组中
        for(int i=0;i<arr.length;i++){
            nArr[i] = arr[i];
        }
        //更新对象头
        arr = nArr;
    }
    arr[size] = data;
    size++;
}
//添加到指定位置
public void add(int index,int data) {
    if (size == arr.length) {
        int[] narr = new int[2 * arr.length];
        for (int i = 0; i < index; i++) {
            narr[i] = arr[i];
        }
        narr[index] = data;
        for (int i = index + 1; i < arr.length; i++) {
            narr[i] = arr[i-1];
        }
        arr=narr;
        size++;
        return;
    }
    for(int i=size-1;i>=index;i--) {
      arr[i+1]=arr[i];
    }
    arr[index]=data;
    size++;
    return;
}

二.链表的特点

链表是数据结构这门课程的,他是一种与数组同等地位的基本数据结构。链表作为一种数据结构,他的特性也非常的明显,那就是他的插入和删除更加的方便,他只用创建一个新的节点,用来存储待操作的元素,然后修改相邻元素或者新节点的指针即可,不需要移动大量的元素。(博主刚学习链表时,用惯了数组的连续空间,不适应这种离散的存储呢,全都是bug,哎,说多了都是泪)

特点:

1.离散型的存储,不需要连续的存储空间。(有效的增加内存的利用率)

2.存储空间具有动态性。(不需要事先分配)

3.元素的插入和删除花费的代价小。(创建一个新的节点,修改指针即可)

缺点:

1.查找元素麻烦。(需要从头结点开始一个一个往后遍历)

2.操作相对于数组更加的困难。

链表的插入与删除的代码如下:

//末尾添加
 public void add(E data){
    Node mid=new Node(data);//创建一个新的节点
    Node head=root.next;//头指针
    if(head==null){    //判断头节点是否为空
        root.next=mid;
        last=mid;   /尾指针移动到当前节点
    }else{
        last.next=mid;
        last=mid;
    }
  size++;//链表长度加1
   }
  //通过索引中间添加,索引从0开始
   public void add(int index,E data){
      Node mid=new Node(data);
      Node head=root.next;
      if((head==null&&index!=0)||(index<0||index>size())){
           System.out.println("添加错误")
        }else{
          Node p=root.next;
          for(int i=0;i<index-1;i++){
             p=p.next;
          }
          mid.next=p.next;
          p.next=mid;
          size++;
      }
 }
  //通过位置删除
 public int remove(int index){
      Node p=root;
      for(int i=0;i<index;i++){
          p=p.next;
      }
      p.next=p.next.next;
      size--;
      return  0;
 }
//通过元素值删除
 public boolean removes(Object data){
    Node p=root;
     while(p.next.data!=data){
        p=p.next;
     }
     p.next=p.next.next;
     size--;
      return true;
 }

两者区别如下:(元素数据类型都为相同的基本类型如int,double等)

            

动态数组链表
内存空间的连续性需要不需要
自动扩容
单个元素存储空间不可更改不可更改
元素的插入和删除不方便方便
元素的查找方便不方便
额外空间有时会保留空余空间需要一个额外的新节点

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值