一、使用双向链表

    1. // 双向链表
    2. class NodeList {
    3. constructor(key, value) {
    4. this.key = key
    5. this.value = value
    6. this.prev = null
    7. this.next = null
    8. }
    9. }
    10. class LRUCache {
    11. constructor(capacity) {
    12. this.capacity = capacity
    13. this.hasTable = {}
    14. this.count = 0
    15. this.dummyHead = new NodeList()
    16. this.dummyTail = new NodeList()
    17. this.dummyHead.next = this.dummyTail
    18. this.dummyTail.prev = this.dummyHead
    19. }
    20. get(key) {
    21. const node = this.hasTable[key]
    22. if (node) {
    23. this.removeToHead(node)
    24. return node.value
    25. }
    26. return -1
    27. }
    28. put(key, value) {
    29. const node = this.hasTable[key]
    30. if (node) {
    31. node.value = value
    32. this.removeToHead(node)
    33. } else {
    34. const newNode = new NodeList(
    35. key,
    36. value
    37. )
    38. this.hasTable[key] = newNode
    39. this.count++
    40. // 溢出则删除最后一个旧节点
    41. if (this.count > this.capacity) {
    42. this.removeOldItem()
    43. }
    44. this.addToHead(newNode)
    45. }
    46. }
    47. // 移动节点到头部
    48. removeToHead(node) {
    49. this.removeToList(node)
    50. this.addToHead(node)
    51. }
    52. // 删除节点
    53. removeToList(node) {
    54. node.prev.next = node.next
    55. node.next.prev = node.prev
    56. }
    57. // 节点加到头部
    58. addToHead(node) {
    59. node.next = this.dummyHead.next
    60. this.dummyHead.next = node
    61. node.prev = this.dummyHead
    62. node.next.prev = node
    63. }
    64. // 删除最后一个旧节点
    65. removeOldItem() {
    66. const oldItem = this.dummyTail.prev
    67. delete this.hasTable[oldItem.key]
    68. this.count--
    69. oldItem.prev.next = this.dummyTail
    70. this.dummyTail.prev = oldItem.prev
    71. }
    72. }

    二、使用map + 迭代器

    1. class LRUCache {
    2. constructor(capacity) {
    3. this.capacity = capacity
    4. this.map = new Map()
    5. }
    6. get(key) {
    7. if (this.map.has(key)) {
    8. const value = this.map.get(key)
    9. this.map.delete(key)
    10. this.map.set(key, value)
    11. return value
    12. }
    13. return -1
    14. }
    15. put(key, value) {
    16. if (this.map.has(key)) {
    17. this.map.delete(key)
    18. } else {
    19. if(this.map.size >= this.capacity) {
    20. this.map.delete(this.map.keys().next().value)
    21. }
    22. }
    23. this.map.set(key, value)
    24. }
    25. }