如何写出高效的链表代码
本篇文章将介绍下面这些内容,阅读预计15分钟。 文章目录 链表和数组区别 面试题常考的链表算法 LeetCode练习题索引 总结: 链表和数组区别 我们在问两个事物的区别时,我们实质是在问这两者分别是什么?而非真的关注差别本身。 数组: 数组是一种线性表数据结构。它用 连续的内存空间 ,存储 相同类型的数据 。 数组因为申请内的存是连续的内存空间,所以在知道First Index 的内存地址后,可以立即通过位置的 偏移 计算出其他任何位置(下标)的内存地址。也就是我们常说的随机访问的特性。 例如存储整数的一个Array,每个整数占4字节,在内存中的情况如下: 在知道arr[0]的内存地址是 0x100后,可以通过公式求取任意位置的内存地址: adrr[n] = 100+4*n 因为这个特性,可以利用CPU的高速缓存,在读取数组时,预读取一组数据,加快访问效率。 链表: 链表也是一种线性表数据结构,它通过 指针 把各个 零散 的节点串联起来。 将数组和链表放在一起看,可以发现,链表的内存地址不一定是连续的,系统不会预先分配给链表指定大小的内存空间。当向链表中存放数据,系统会寻找未使用的内存块,存放数据,然后把前一个节点的指针指向该内存。 所以当数组申请一个1G大小的空间时,系统可能因为没有足够的内存空间而创建失败。而链表不存在这样的问题,它使用的是系统中零散的内存。