-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlinkedlist.hpp
74 lines (70 loc) · 1.78 KB
/
linkedlist.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#ifndef LINKEDLIST_HPP
#define LINKEDLIST_HPP
// simple doubly-linked list with sentinel head & tail
class Node {
public:
// node will point to index of the block/entry *in a set*
uint64_t indexOfBlockOrEntry;
Node* prev;
Node* next;
Node() : indexOfBlockOrEntry{0}, prev{nullptr}, next{nullptr} {}
Node(uint64_t indexOfBlockOrEntry)
: indexOfBlockOrEntry{indexOfBlockOrEntry},
prev{nullptr},
next{nullptr} {}
};
class LinkedList {
public:
Node* head;
Node* tail;
LinkedList() {
head = new Node(0);
tail = new Node(0);
head->next = tail;
tail->prev = head;
}
void pushBack(uint64_t indexOfBlockOrEntry) {
Node* node = new Node(indexOfBlockOrEntry);
node->next = tail;
node->prev = tail->prev;
tail->prev->next = node;
tail->prev = node;
}
void pushFront(uint64_t indexOfBlockOrEntry) {
Node* node = new Node(indexOfBlockOrEntry);
node->next = head->next;
node->prev = head;
head->next->prev = node;
head->next = node;
}
void pushFront(Node* node) {
node->next = head->next;
node->prev = head;
head->next->prev = node;
head->next = node;
}
void remove(Node* node) {
node->next->prev = node->prev;
node->prev->next = node->next;
}
// used to mark a specific node (which points to a block/entry)
// as the MRU
void moveToFront(Node* node) {
remove(node);
pushFront(node);
}
uint64_t front() const { return head->next->indexOfBlockOrEntry; }
uint64_t back() const { return tail->prev->indexOfBlockOrEntry; }
Node* frontNode() const { return head->next; }
Node* backNode() const { return tail->prev; }
~LinkedList() {
Node* tmp = head;
Node* aux;
while (tmp != nullptr) {
aux = tmp;
tmp = tmp->next;
delete aux;
}
}
};
#endif