0%

面试题59 - II. 队列的最大值

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
75
76
77
78
79
80
81
class listNode {
public:
listNode() {val = 0; next = NULL;}
listNode(int v) {val = v; next = NULL;}
listNode(int v, listNode *n) {val = v; next = n;}
int val;
listNode *next;
};

class MaxQueue {
public:
MaxQueue() {
head = NULL;
tail = NULL;
maxVal = NULL;
}

int max_value() {
if (maxVal == NULL)
return -1;
else
return maxVal->val;
}

void push_back(int value) {
listNode *newNode = new listNode(value, NULL);
if (head == NULL) {
head = newNode;
tail = newNode;
maxVal = newNode;
}
else {
tail->next = newNode;
tail = newNode;
if (value >= maxVal->val)
maxVal = newNode;
}
}

int pop_front() {
if (head == NULL)
return -1;
else {
int res;
if (head == tail) {
res = head->val;
delete head;
head = NULL;
tail = NULL;
maxVal = NULL;
} else {
listNode *temp = head->next;
res = head->val;
if (head == maxVal) {
maxVal = head->next;
listNode *p = maxVal->next;
while (p != NULL) {
if (p->val >= maxVal->val)
maxVal = p;
p = p->next;
}
}
delete head;
head = temp;
}
return res;
}
}
private:
listNode *head;
listNode *tail;
listNode *maxVal;
};

/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue* obj = new MaxQueue();
* int param_1 = obj->max_value();
* obj->push_back(value);
* int param_3 = obj->pop_front();
*/