单向、双向链表
单链表和双链表最简单的练习
1)单链表和双链表如何反转
2)删除给定值的全部节点
- 遍历链表,找到第一个不是给定值的元素,即为头结点
- while与if结合使用,通过两个变量(类似指针)来删除节点
栈和队列
经典题目
1)怎么用数组实现不超过固定大小的队列和栈
栈:正常使用数组
队列:使用环形数组
2)设计一个特殊的栈,在基本功能的基础上,再实现返回栈中最小元素的功能,且时间复杂度均为O(1)
思路:
- 准备两个栈:Data栈和Min栈
- 当加入数据时,Data栈正常加入,而Min栈除了第一个元素直接入栈以外,接下来每来一个元素都与Min栈栈顶比较,压入较小的元素(例如:如果外来元素为4,而栈顶为3,则将3入栈)
- 两个栈同时压入元素,同时弹出元素。用户使用push()、pop()方法返回Data栈的栈顶元素,使用getMin()(获得最小元素)的方法时,将Min栈栈顶元素返回即可
注意:两个栈一定要同时入同时出
package calss02;
import java.util.Stack;
public class GetStackMinEle {
public static class MyStack{
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MyStack(){
this.stackData = new Stack<Integer>();
this.stackMin = new Stack<Integer>();
}
public int getMin(){
if(this.stackMin.isEmpty()){
throw new RuntimeException("你的栈是空的");
}
return this.stackMin.peek();
}
public void push(int newNum){
if(this.stackMin.isEmpty()){
this.stackMin.push(newNum);
}else if(newNum<this.getMin()){
this.stackMin.push(newNum);
}else {
int newMin = this.stackMin.peek();
this.stackMin.push(newMin);
}
this.stackData.push(newNum);
}
public int pop(){
if(this.stackData.isEmpty()){
throw new RuntimeException("你的栈是空的");
}
this.stackMin.pop();
return this.stackData.pop();
}
}
public static void main(String[] args) {
MyStack myStack = new MyStack();
myStack.push(3);
myStack.push(2);
myStack.push(3);
myStack.push(1);
myStack.push(4);
myStack.push(4);
myStack.pop();
int min = myStack.getMin();
System.out.println(min);//1
}
}