解题思路
挺不好写的,主要是判断压入和推出,当删除到为空时,怎么关联最小值
最小值怎么确定,使用的时一个最小值链表,当最小值链表的长度小于等于总的链表长度时,最小值就是最小值链表的最后一个,这是一个技巧
代码
class Node{
int val;
Node prev;
Node next;
Node(){}
Node(int val){this.val = val;}
Node(int val, Node next) {this.val=val;this.next=next;}
Node(int val, Node prev, Node next){this.val=val;this.prev=prev;this.next=next;}
}
class MinStack {
Node dummy;
Node tail;
Node min;
int mincount;
int count;
int point;
/** initialize your data structure here. */
public MinStack() {
this.dummy = new Node(0);
this.count=0;
}
public void push(int x) {
if(this.tail==null){ // 在初始化时,需要用到null
this.tail = new Node(x);
this.dummy.next = this.tail; // 末尾的tail
this.tail.prev = this.dummy;
// 此时将唯一的值也就是最小值存进去
this.min = new Node(x);
this.mincount++;
}else{ // 在形成了一个链表时
Node p = new Node(x); // 压入时间复杂度为O(1)
this.tail.next = p;
p.prev = this.tail;
this.tail = p;
// 使用一个min链表,当插入的值小于等于min值时,当min的链表小于总链表时,那么最小值就是最后一个
if(x <= this.min.val){
p = new Node(x); // 重新生成一个节点
this.min.next = p;
p.prev = this.min;
this.min = p;
this.mincount++;
}
}
this.count++;
}
public void pop() {
this.tail = this.tail.prev;
if(this.tail==this.dummy) {this.tail = (this.dummy.next=null); this.min=null;return;} // 对删除到0时做处理
if(this.tail.next.val==this.min.val) {
this.mincount--;
this.min = this.min.prev;
this.min.next = null;
}
this.tail.next = null;
this.count = this.count==0 ? 0 : count-1;
}
public int top() {
return this.tail.val;
}
public int min() {
return this.min.val;
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/