O(1)增删单向链表实现LRU思路

昨天下午面试,被问到如何用单向列表实现O(1)增删。当时没想出来,事后想起自己曾见过将链表节点存入字典的操作。字典的查询不就是O(1)嘛。

但怎么通过这种方式对链表进行增删呢?

一种思路是改成双向链表实现。这里暂不讨论。

第二种思路是字典的key存x节点的值,key对应的value则存x的亲节点w。但这样就需要加一个虚拟头节点以获取真实的头节点,并且在增删节点的时候有些复杂。这其实是借助字典变相实现双链表

对于w->x->y->z
创建node(v),v.next = w
即(v)->w->x->y->z
维护两个指针head=v,tail=z

dict = {w.value: v, x.value: w, y.value: x, z.value: y}

将x移到尾部:
1.跟据x.value找到w节点
2.w.next获取x节点
2.w.next.next获取y节点
3.跟据y.value修改字典键值对{y.value: x}为{y.value: w},且令w.next = y
4.修改字典键值对{x.value: w}为{x.value: tail},且令tail.next = x
5.令tail=x

第三种方法是在网上找到的,思路比较新奇——直接修改节点的值,相较而言也更简单。

对于w(w.value)->x(x.value)->y(y.value)->z(z.value)
维护两个指针head=w,tail=z

dict = {w.value: w, x.value: x, y.value: y, z.value: z}

将x移到尾部:
1.跟据x.value找到x节点
2.x.next获取y节点
2.暂存tem = x.value,令x.value = y.value
3.x.next = y.next
4.tail.next = node(tem)
5.令tail=tail.next

最后得到w(w.value)->x(y.value)->z(z.value)->new(x.value)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值