数组与链表

作者: iOS小洁 | 来源:发表于2023-02-01 20:39 被阅读0次

数组

数组是一种顺序存储的线性表,所有元素的内存地址是连续

缺点:

  • 无法动态修改容量
  • 造成空间浪费

动态数组

可以动态修改数组容量

复杂度:最好:O(1) 最坏:O(n) 平均:O(1) 均摊:O(1)

均摊复杂度:经过连续的多次复杂度比较低的情况后,出现个别复杂度比较高的情况

复杂度震荡:扩容倍数、缩容时机设计不得当,有可能会导致复杂度震荡

链表

链表是一种链式存储的线性表,所有元素的内存地址不一定是连续的

双向链表

双向链表比单向链表的效率更高。在删除操作中,操作数量可以减少近一半

单向链表删除操作,平均复杂度1/2 + n/2

双向链表删除操作,平均复杂度1/2 + n/4

发挥链表最大威力

可以考虑增设1个成员变量、3个方法

  • current :用于指向某个节点
  • void reset() :让 current 指向头结点 first
  • E next() :让 current 往后走一步,也就是 current = current.next
  • E remove() :删除 current 指向的节点,删除成功后让 current 指向下一个节点

链表练习

237. 删除链表中的节点

206. 反转链表

141. 环形链表

203. 移除链表元素

83. 删除排序链表中的重复元素

876. 链表的中间结点

线性结构接口设计

数组链表需要实现的公共接口如下:

public interface List<E> {
    static final int ELEMENT_NOT_FOUND = -1;
    /**
     * 清除所有元素
     */
    void clear();

    /**
     * 元素的数量
     * @return
     */
    int size();

    /**
     * 是否为空
     * @return
     */
    boolean isEmpty();

    /**
     * 是否包含某个元素
     * @param element
     * @return
     */
    boolean contains(E element);

    /**
     * 添加元素到尾部
     * @param element
     */
    void add(E element);

    /**
     * 获取index位置的元素
     * @param index
     * @return
     */
    E get(int index);

    /**
     * 设置index位置的元素
     * @param index
     * @param element
     * @return 原来的元素ֵ
     */
    E set(int index, E element);

    /**
     * 在index位置插入一个元素
     * @param index
     * @param element
     */
    void add(int index, E element);

    /**
     * 删除index位置的元素
     * @param index
     * @return
     */
    E remove(int index);

    /**
     * 查看元素的索引
     * @param element
     * @return
     */
    int indexOf(E element);
}

数组链表公共方法如下:

public abstract class AbstractList<E> implements List<E> {

    /**
     * 元素的数量
     */
    protected int size;
    /**
     * 元素的数量
     * @return
     */
    public int size() {
        return size;
    }

    /**
     * 是否为空
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 是否包含某个元素
     * @param element
     * @return
     */
    public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

    /**
     * 添加元素到尾部
     * @param element
     */
    public void add(E element) {
        add(size, element);
    }

    protected void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
    }

    protected void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }

    protected void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }
}

动态数组与链表对比

复杂度对比

动态数组 链表
最好 最坏 平均 最好 最坏 平均
add(int index, E element) O(1) O(n) O(n) O(1) O(n) O(n)
remove(int index) O(1) O(n) O(n) O(1) O(n) O(n)
set(int index, E element) O(1) O(1) O(1) O(1) O(n) O(n)
get(int index) O(1) O(1) O(1) O(1) O(n) O(n)

动态数组:开辟、销毁内存空间的次数相对较少,但可能造成内存空间浪费(可以通过缩容解决)

双向链表:开辟、销毁内存空间的次数相对较多,但不会造成内存空间的浪费

如何选择:

  • 如果频繁在尾部进行添加、删除操作,动态数组、双向链表均可选择
  • 如果频繁在头部进行添加、删除操作,建议选择使用双向链表
  • 如果有频繁的(在任意位置)添加、删除操作,建议选择使用双向链表
  • 如果有频繁的查询操作(随机访问操作),建议选择使用动态数组

相关文章

  • 数据结构-链表

    章节 动态数组 & 栈 & 队列 与 链表的不同 链表特性 & 图示 链表实现 & 各操作时间复杂度分析 动态数组...

  • python笔试面试项目实战2020百练2选择排序冒泡排序

    链表与数组 链表的优势在插入元素方面,需要随机地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素。在链表中...

  • 数据结构和算法

    1、数组和链表区别(1)物理存储结构不同。链表与数组在计算中存储元素采用不同的存储结构,数组是顺序存储结构,链表是...

  • 数据结构与算法之美 —— 如何实现LRU缓存淘汰算法?(总结)

    链表与数组 链表定义: 百度百科 数组定义:百度百科 总结:链表和数组最大差别是在内存空间结构上,连续(数组)和...

  • 链表

    链表 缺点:查找复杂有点:定点删除/插入元素 单链表 双向链表 循环链表 双向循环链表 数组与链表的区别 数据存储...

  • 算法与数据结构(四)栈与队列

    上次聊到数组与链表,它们都是线性表,数组与链表的本质区别是内存是否连续,进而得出结论:数组可以在 O(1) 时间复...

  • 大数据(架构师)面试系列(5)

    1.数组与链表的区别是什么? 线性表--数组和链表的区别链表和数组的区别在哪里? 2.Scala函数式编程的特点?...

  • Java集合源码分析之Map(一):超级接口Map

    数组与链表在处理数据时各有优缺点,数组查询速度很快而插入很慢,链表在插入时表现优秀但查询无力。哈希表则整合了数组与...

  • 三、数据结构与算法 — 链表

    链表与数组的区别 链表不是连续的 单链表与循环链表 注意链表中的头结点和尾结点。 循环链表从尾可以方便的到头,适合...

  • 静态链表及C#实现

    静态链表 静态链表是用数组模拟动态链表。 静态链表结构描述 首先,静态链表使用数组来模拟动态链表。数组存放一个节点...

网友评论

    本文标题:数组与链表

    本文链接:https://www.haomeiwen.com/subject/msaihdtx.html