链表

0x01 链表结构

与数组相反,链表通过指针将一组零散的内存串联起来使用

常见有三种链表:单链表、双向链表、循环链表

单链表

单链表只有一个方向,每个链表元素包含数据和一个指向下一结点的指针,尾节点指向null

单链表的插入和删除操作时间复杂度都是O(1),查找需要从头结点开始遍历,所以时间复杂度是O(n)


image

这里插入和删除都是在明确结点位置的情况下位O(1),但是在实际情况中,一般要先找到结点才能进行插入和删除操作

循环链表

循环链表是一种特殊的单链表,循环链表的尾结点指向头结点,整个链表构成一个环

循环链表的优点是从链表尾到链表头非常方便,当要处理的数据具有环形结构特点时适合使用循环链表,例如约瑟夫问题

双向链表

双向链表每个结点包含数据和指向前驱和后继的两个指针

相比单链表,双向链表通过前驱指针,可以方便的找到前驱结点,在插入和删除的时候,就有很大优势

  • 删除

如果我们已经找到要删除的元素,我们还需要找到删除元素的前驱结点,从而把前驱结点指向正确的位置,这时候双向链表可以很方便的找到前驱结点

  • 插入

同理当我们要在指定元素前面插入结点时,双向链表也可以很方便的找到前驱结点,从而实现插入操作

所以,尽管单链表更省空间,实际编程语言中大多使用双向链表,例如java中的LinkedList就是使用的双向链表

数组 VS 链表
时间复杂度 数组 链表
插入、删除 O(n) O(1)
随机访问 O(1) O(n)

在实际的使用过程中,也不能局限于时间复杂度去选择,数组操作方便,但是占用的是连续的内存,并且大小固定,如果超出数组大小,需要手动扩容,迁移整个数组,开销很大,链表内存空间不连续,大小没有限制,但是每个结点相比数组都多了指针,所以会占据更多空间

0x02 问题 LRU缓冲算法

缓存淘汰策略

当缓存被用满时,哪些数据应该被清理出去,常见的策略有三种

1、先进先出FIFO(first in first out)

2、最少使用策略LFU(least frequently used)

3、最近最少使用策略LRU(least recently used)

所谓LRU就是将最近使用最少的删除

链表实现

思路

1、维护一个单链表,每个结点都是缓存的元素,越后面的结点是越少访问的

2、每次有新元素,从头遍历链表,如果找到了,那么从链表中删除,并在头结点插入这个元素

3、如果没有找到,那么直接在头结点插入元素,如果缓存满了,删除尾结点,然后在头部插入元素

这里每次查找缓存都要遍历链表,可以优化一下,使用散列表记录数据,后面学到散列表在补上代码

0x03 课后思考

如何判断一个字符串是否是回文字符串的问题,使用单链表

// 定义单链表类型
case class Node[E](var data:E,var next:Option[Node]){}
// scala case class可以直接使用==比较,不比较地址
def checkPhrase(node:Option[Node]): Boolean ={
    if (node.isEmpty || node.get.next.isEmpty){
      return true
    }
    // 定义快慢指针
    var slow,fast = node
    // fast总是在奇数位置,从1到3到5到7 slow指向中点或者后半段第一个结点
    while (fast.isDefined && fast.get.next.isDefined){
      slow = slow.get.next
      fast = fast.get.next.get.next
    }
    var pre:Option[Node] = None
    var current:Option[Node] = node
    while (current != slow){
      var tmp = current.get.next
      current.get.next = pre
      pre = current
      current = tmp
    }
    // fast为空,则共有偶数个结点,slow位于后半段的第一个
    if (fast.isEmpty){
      pre == slow
    }else{
      pre == slow.get.next
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容