链表好用不?

链表就先以单向链表为例,简单讲解下,为何有时用链表,有时却觉得数组(列表)。

首先必须初始化数组,然后把新节点的指针指向next,这个地方指针容易出错,须注意下。

初始化节点cur


cur指向next


prev指向cur

删除操作,先找上节点,将其指针,直接指向next。这时,你会说,咦,cur.next指针没有清空啊,emmm,那你也可以清空。指向null。

delete节点


双向列表实现,只要给next,加上pre属性,让它指向前面cur,就行。

双向链表


循环链表

循环列表实现时,将头节点的next属性指向其本身,然一次添加元素即可。

现在看看,链表的优势和劣势。

链表通过‘指针’将一组零散的内存串联起来,就可以充分利用内存;而数组内存需连续的,足够大的空间。

但是呢,链表也得支持增改删查,每次遍历最优时间复杂度O(1),最差时间复杂度O(n),而数组只要用下表就可以访问到,时间复杂度O(1),如果随机查找,时间复杂度则是,O(n).

在开发中,一般用双向列表或者循环列表,这样就能大大降低,所需的时间复杂度。其实仔细想想,这就是用时间换空间的思路。

简单介绍下,CPU缓存:cpu从内存中读取数据时,会把每次取到的数据加载到CPU的缓存中。而CPU每次从内存中读取数据并不是只读取那个特定要访问的地址,而是读取一个数据块,并保存到CPU缓存中,然后下次访问内存数据的时候就会从CPU缓存中开始查找,如果没找到,就从内存中取。这样就实现了比内存访问更快的机制。

对于数组而言,存储空间是连续的,所以在加载某个下标元素时,可以把以后的几个下标元素在也加载到CPU缓存这样,执行起来速度更快(比访问内存),比存储空间不连续的链表存储也快。

如果,我们能利用缓存链表,那么又能降低操作链表的时间复杂度了。也可采用2-8策略,用过的元素放到链表最前面,少用的自然就在后面了,这个实现,可用哈希表来记录数据的位置;缓存呢,注意一下,是否达到上限就行。

reference:极客时间 《数据结构与算法之美》

               《数据结构与算法javascript描述》

                 部分源码:https://github.com/Jiangjao/python_learn_demo/new/master

                 部分图片来源:leetcode 链表介绍

详细细节,有时间再慢慢添加。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 链表(上):如何实现LRU缓存淘汰算法? 今天我们来聊聊“链表(Linked list)”这个数据结构。学习链表有...
    GhostintheCode阅读 1,407评论 0 4
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,586评论 1 32
  • CPU Cache 今天的CPU比25年前更复杂。那时候,CPU内核的频率与内存总线的频率相当。内存访问只比寄存器...
    blueshadow阅读 3,206评论 0 5
  • 班级情况: 校区:科学创想乐高机器人茂业校区 时间:周日4:00——5:00 学员:孟宣淇 任教老师:李飞 教学目...
    A越单纯越幸福阅读 1,597评论 1 1
  • 小浪荡漾,轻风柳扬。一江碧水混碧落,吹来袅袅桂花香。花匝两岸,两岸飘香。忘知料峭薄衾裳,很可能赚了风凉。今晚赏月,...
    傲视五洲阅读 371评论 3 5

友情链接更多精彩内容