File tree 3 files changed +234
-0
lines changed
3 files changed +234
-0
lines changed Original file line number Diff line number Diff line change @@ -610,6 +610,85 @@ public class LRUCache {
610
610
*/
611
611
```
612
612
613
+ ``` swift
614
+ class Node {
615
+ var key: Int
616
+ var val: Int
617
+ var prev: Node?
618
+ var next: Node?
619
+
620
+ init (_ key : Int = 0 , _ val : Int = 0 ) {
621
+ self .key = key
622
+ self .val = val
623
+ }
624
+ }
625
+
626
+ class LRUCache {
627
+ private var cache: [Int : Node] = [: ]
628
+ private let head: Node = Node ()
629
+ private let tail: Node = Node ()
630
+ private var capacity: Int
631
+ private var size: Int = 0
632
+
633
+ init (_ capacity : Int ) {
634
+ self .capacity = capacity
635
+ head.next = tail
636
+ tail.prev = head
637
+ }
638
+
639
+ func get (_ key : Int ) -> Int {
640
+ guard let node = cache[key] else {
641
+ return -1
642
+ }
643
+ moveToHead (node)
644
+ return node.val
645
+ }
646
+
647
+ func put (_ key : Int , _ value : Int ) {
648
+ if let node = cache[key] {
649
+ node.val = value
650
+ moveToHead (node)
651
+ } else {
652
+ let newNode = Node (key, value)
653
+ cache[key] = newNode
654
+ addToHead (newNode)
655
+ size += 1
656
+ if size > capacity {
657
+ if let tailNode = removeTail () {
658
+ cache.removeValue (forKey : tailNode.key )
659
+ size -= 1
660
+ }
661
+ }
662
+ }
663
+ }
664
+
665
+ private func moveToHead (_ node : Node) {
666
+ removeNode (node)
667
+ addToHead (node)
668
+ }
669
+
670
+ private func removeNode (_ node : Node) {
671
+ node.prev ? .next = node.next
672
+ node.next ? .prev = node.prev
673
+ }
674
+
675
+ private func addToHead (_ node : Node) {
676
+ node.prev = head
677
+ node.next = head.next
678
+ head.next ? .prev = node
679
+ head.next = node
680
+ }
681
+
682
+ private func removeTail () -> Node? {
683
+ guard let res = tail.prev, res !== head else {
684
+ return nil
685
+ }
686
+ removeNode (res)
687
+ return res
688
+ }
689
+ }
690
+ ```
691
+
613
692
<!-- tabs:end -->
614
693
615
694
<!-- end -->
Original file line number Diff line number Diff line change @@ -623,6 +623,85 @@ public class LRUCache {
623
623
*/
624
624
```
625
625
626
+ ``` swift
627
+ class Node {
628
+ var key: Int
629
+ var val: Int
630
+ var prev: Node?
631
+ var next: Node?
632
+
633
+ init (_ key : Int = 0 , _ val : Int = 0 ) {
634
+ self .key = key
635
+ self .val = val
636
+ }
637
+ }
638
+
639
+ class LRUCache {
640
+ private var cache: [Int : Node] = [: ]
641
+ private let head: Node = Node ()
642
+ private let tail: Node = Node ()
643
+ private var capacity: Int
644
+ private var size: Int = 0
645
+
646
+ init (_ capacity : Int ) {
647
+ self .capacity = capacity
648
+ head.next = tail
649
+ tail.prev = head
650
+ }
651
+
652
+ func get (_ key : Int ) -> Int {
653
+ guard let node = cache[key] else {
654
+ return -1
655
+ }
656
+ moveToHead (node)
657
+ return node.val
658
+ }
659
+
660
+ func put (_ key : Int , _ value : Int ) {
661
+ if let node = cache[key] {
662
+ node.val = value
663
+ moveToHead (node)
664
+ } else {
665
+ let newNode = Node (key, value)
666
+ cache[key] = newNode
667
+ addToHead (newNode)
668
+ size += 1
669
+ if size > capacity {
670
+ if let tailNode = removeTail () {
671
+ cache.removeValue (forKey : tailNode.key )
672
+ size -= 1
673
+ }
674
+ }
675
+ }
676
+ }
677
+
678
+ private func moveToHead (_ node : Node) {
679
+ removeNode (node)
680
+ addToHead (node)
681
+ }
682
+
683
+ private func removeNode (_ node : Node) {
684
+ node.prev ? .next = node.next
685
+ node.next ? .prev = node.prev
686
+ }
687
+
688
+ private func addToHead (_ node : Node) {
689
+ node.prev = head
690
+ node.next = head.next
691
+ head.next ? .prev = node
692
+ head.next = node
693
+ }
694
+
695
+ private func removeTail () -> Node? {
696
+ guard let res = tail.prev, res !== head else {
697
+ return nil
698
+ }
699
+ removeNode (res)
700
+ return res
701
+ }
702
+ }
703
+ ```
704
+
626
705
<!-- tabs:end -->
627
706
628
707
<!-- end -->
Original file line number Diff line number Diff line change
1
+ class Node {
2
+ var key : Int
3
+ var val : Int
4
+ var prev : Node ?
5
+ var next : Node ?
6
+
7
+ init ( _ key: Int = 0 , _ val: Int = 0 ) {
8
+ self . key = key
9
+ self . val = val
10
+ }
11
+ }
12
+
13
+ class LRUCache {
14
+ private var cache : [ Int : Node ] = [ : ]
15
+ private let head : Node = Node ( )
16
+ private let tail : Node = Node ( )
17
+ private var capacity : Int
18
+ private var size : Int = 0
19
+
20
+ init ( _ capacity: Int ) {
21
+ self . capacity = capacity
22
+ head. next = tail
23
+ tail. prev = head
24
+ }
25
+
26
+ func get( _ key: Int ) -> Int {
27
+ guard let node = cache [ key] else {
28
+ return - 1
29
+ }
30
+ moveToHead ( node)
31
+ return node. val
32
+ }
33
+
34
+ func put( _ key: Int , _ value: Int ) {
35
+ if let node = cache [ key] {
36
+ node. val = value
37
+ moveToHead ( node)
38
+ } else {
39
+ let newNode = Node ( key, value)
40
+ cache [ key] = newNode
41
+ addToHead ( newNode)
42
+ size += 1
43
+ if size > capacity {
44
+ if let tailNode = removeTail ( ) {
45
+ cache. removeValue ( forKey: tailNode. key)
46
+ size -= 1
47
+ }
48
+ }
49
+ }
50
+ }
51
+
52
+ private func moveToHead( _ node: Node ) {
53
+ removeNode ( node)
54
+ addToHead ( node)
55
+ }
56
+
57
+ private func removeNode( _ node: Node ) {
58
+ node. prev? . next = node. next
59
+ node. next? . prev = node. prev
60
+ }
61
+
62
+ private func addToHead( _ node: Node ) {
63
+ node. prev = head
64
+ node. next = head. next
65
+ head. next? . prev = node
66
+ head. next = node
67
+ }
68
+
69
+ private func removeTail( ) -> Node ? {
70
+ guard let res = tail. prev, res !== head else {
71
+ return nil
72
+ }
73
+ removeNode ( res)
74
+ return res
75
+ }
76
+ }
You can’t perform that action at this time.
0 commit comments