栈和队列
序号 | 题目 | 笔记 | 日期 |
1 | 栈是一种先进后出的数据结构,队列却是一种先进先出的数据结构。根据栈先进后出的特性,我们每次往第一个栈里插入元素后,第一个栈的底部元素是最后插入的元素,第一个栈的顶部元素是下一个待删除的元素。 | ||
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空
//用两个栈实现队列
class CQueue {
Deque<Integer>stack1;
Deque<Integer>stack2;
public CQueue() {
stack1=new LinkedList<Integer>();
stack2=new LinkedList<Integer>();
}
public void appendTail(int value) {
stack1.push(value);//元素压栈
}
public int deleteHead() {
//如果第二个栈为空栈
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());//第一个栈里的元素一个个弹出插入到第二个栈里
}
}
//删除操作直接弹出第二个栈的元素返回即可
if(stack2.isEmpty()){
return -1;
}else{
int deleteItem=stack2.pop();
return deleteItem;
}
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
链表
序号 | 题目 | 笔记 | 日期 |
1 | 栈的特点是后进先出,使用栈将链表元素顺序倒置。 | ||
2 | 使用双指针 l_1l1 和 l_2l2 遍历两链表 初始化一个辅助节点 dumdum 作为合并链表的伪头节点,将各节点添加至 dumdum 之后 | ||
3 | |||
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int[] reversePrint(ListNode head) {
Stack<ListNode> stack = new Stack<ListNode>();//创建一个栈,用于存储链表的节点
ListNode temp = head;//创建一个指针,初始时指向链表的头节点
while (temp != null) {//将指针指向的节点压入栈内
stack.push(temp);
temp = temp.next;//将指针移到当前节点的下一个节点
}
int size = stack.size();//获得栈的大小 size,创建一个数组 print,其大小为 size
int[] print = new int[size];
for (int i = 0; i < size; i++) {
print[i] = stack.pop().val;
}
return print;
}
}
二叉树
序号 | 题目 | 笔记 | 日期 |
1 | 交换每个节点的左 / 右子节点,递归地对树进行遍历,并从叶子节点先开始翻转得到镜像 | ||
数组
-
for(int num:nums){}
-
含义:遍历数组nums中的所有元素,循环体中nums[i]用num替代,
num == nums[i]
-
int rows = matrix.length, columns = matrix[0].length;
序号 | 题目 | 笔记 | 日期 |
1 | 利用数据结构特点,容易想到使用哈希表(Set)记录数组的各个数字,当查找到重复数字则直接返回 | ||
2 | 依次遍历二维数组的每一行和每一列 | ||
3 | 利用二分法查找 | ||
字符串
序号 | 题目 | 笔记 | 日期 |
1 | 遍历列表 s 中的每个字符 c,利用到字符串数组toCharArray,append 在列表末尾添加新的对象。 | ||
2 | |||
3 | |||
动态规划
一二题有什么区别
二?为什么
序号 | 题目 | 笔记 | 日期 |
1 | F(n)=F(n−1)+F(n−2),斐波那契数列问题: f(0)=0, f(1)=1 , f(2)=1 | ||
2 | F(n)=F(n−1)+F(n−2),f(0)=1, f(1)=1 , f(2)=2 | ||