[LeetCode]155. 最小栈(java实现)用链表实现栈
1. 题目
2. 读题(需要重点注意的东西)
栈的特性—先进后出
思路:
这里选择用链表来实现,头插法的链表,可以视为一个栈。
本题的难点在于如何取最小值,其思路也很简单,即对每个入栈的节点,设计一个属性minVal,其意义是存到该节点时,链表里的最小值。
因此当有节点出栈后,链表里的最小值也能够通过调用属性在单位时间内给出。
class ListNode {
// 链表节点的三个属性,值、当前链表的最小值、指向下一个节点的指针
int val;
int minVal;
ListNode next;
// 构造函数
ListNode(int val,int minVal){
this.val = val;
this.minVal = minVal;
this.next = null;
}
}
3. 解法
---------------------------------------------------解法---------------------------------------------------
class MinStack {
private int min = Integer.MAX_VALUE;
private ListNode head;
/** initialize your data structure here. */
public MinStack() {
}
public void push(int val) {
if(head == null) head = new ListNode(val,val);
else{
ListNode cur = head;
head = new ListNode(val,Math.min(val,head.minVal));
head.next = cur;
}
}
// 注意是void
public void pop() {
head = head.next;
}
public int top() {
return head.val;
}
public int getMin() {
return head.minVal;
}
// 定义链表
class ListNode {
// 链表节点的三个属性,值、当前链表的最小值、指向下一个节点的指针
int val;
int minVal;
ListNode next;
// 构造函数
ListNode(int val,int minVal){
this.val = val;
this.minVal = minVal;
this.next = null;
}
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
4. 可能有帮助的前置习题
[LeetCode]160. 相交链表(java实现),了解链表的结构与基础
5. 所用到的数据结构与算法思想
6. 总结
经过头插法生成的链表可以视为一个栈来使用。
其次,链表的定义,需要能熟记默写。
class ListNode {
// 链表节点的三个属性,值、当前链表的最小值、指向下一个节点的指针
int val;
int minVal;
ListNode next;
// 构造函数
ListNode(int val,int minVal){
this.val = val;
this.minVal = minVal;
this.next = null;
}
}