1、反转链表
虚拟头结点 + pre指针、当前指针
2、链表内指定区间反转
区间内节点头插 + [标记子区间的前一个节点 + cur始终指向的都是子集的第一个元素 + pre始终指向子集的前一个节点]
3、链表中节点每K个一组反转
递归 + pre指针、当前指针
4、合并两个有序的链表
虚拟头结点,遍历两个链表,遇到小的追加到头结点后面
5、合并k个已排序的链表【难】 ❌ 递归 + 合并两个有序链表的思路
6、判断链表是否有环
快慢指针,死循环,快慢指针相等-》有环,快指针为null时-》无环
7、链表中环的入口结点
先判断链表是否有环,有环->相遇节点 和头结点 共同走n步就是环的入口节点
8、链表中倒数最后k个结点
快慢指针。快指针先走K步,终止条件是快指针==null,慢指针的位置就是倒数第K个节点
9、删除链表倒数第n个节点 快慢指针。添加虚拟头结点,快指针先走n+1步,慢指针是倒数第n个节点的前一个节点,可以执行删除
10、两个链表的第一个公共节点
指针1,指针2:指针1走完list1,紧接着走list2;指针2走完list2紧接着走list1。有相交就返回相交的点,不想交最后指针1,指针2都是null,也会返回
11、链表中的两数相加
链表 + 栈。出栈的时候计算和值,其中某个栈为空后,默认为+0,记录高位,最后判断高位是否>0,
12、链表排序
13、判断一个链表是否为回文结构
第一遍将链表放入到栈中,第二遍出栈和链表头部开始遍历,判断相等
14、链表的奇偶重排
快慢指针,慢指针指向快指针的下一个位置;快指针同样的逻辑,指向慢指针的下一个
15、删除有序链表中的重复元素
快慢指针。快指针==慢指针 -》 slow.next = fast.next;fast = fast.next;
16、删除链表有序元素 II
虚拟头结点。pre.next.val == pre.next.next.val 时找到第一个与这些value不一样的值set为pre.next
数组模块:
1、二分查找。无重复升序数组find 一个元素
左指针,右指针。中间是mid指针
2、二维数组找数
从数组的第一行最后一个数开始判断
3、寻找峰值。二维数组乱序,找出k:k-1 < k < k+1
二分查找。判断mid、和mid+1之间的关系,判断向右还是向左找
4、数组中的逆序对 ❌
5、旋转数组的最小数字。数组分为两部分,每部分都是非降序,求中间波谷元素
二分查找。mid的值与right的值进行比对
6、比较版本号
解析版本号char对应的int值:'1'-'0',逐位比对
二叉树:
1、二叉树前序遍历
2、二叉树中序遍历
3、二叉树后序遍历
上面三种都是使用递归方式
4、二叉树层级遍历
返回值ArrayList<ArrayList> 辅助数据结构:队列
5、之字型打印二叉树
返回值ArrayList<ArrayList> 辅助数据结构:队列 前半部分与层级遍历一致,添加标志位判断,偶数行需要reverse,奇数行不需要
6、二叉搜索树与双向链表
没做出来
7、判断二叉树是否对称
递归判断root1.right是否等于root2.left + root1.left是否等于root2.right
8、合并两个二叉树
递归遍历两个二叉树,但凡一个节点为空,用另一棵树节点代替,两个节点都为空,return null;都不为空时创建新节点,val=两节点之和,left=递归调用(roo1.left, root2.left);right=递归调用(root1.right, root2.right)
9、二叉树的镜像
使用递归,根左右的方式,每次遍历到一个节点的时候,将节点的左右子树交换
10、判断二叉树是不是二叉搜索树
递归使用左根右,中序方式进行遍历。先在最左边找,如果有不符合左<根<右的 直接return,再判断右子树
11、判断一个是否是完全二叉树
层序遍历,在出队列时如果有空元素,则判断已经到最后的节点,如果右面还有元素出栈,则不符合完全二叉树定义
12、判断一棵树是否是平衡二叉树
递归调用。取左子树的高度,取右子树的高度,判断左右字数高度差是否>1?
求树的高度的方式:递归调用,左子树的高度,右子树的高度 +1 最终返回Max的一个高度
13、二叉搜索树的最近公共祖先
难度更高一点:二叉树的最近公共祖先
递归实现:方法入参中的root节点的值==参数val1 || root节点值 == 参数val2 直接返回root;否则的话递归查找root.left,root.right 中是否存在这样的节点
栈和队列 1、用两个栈实现队列 出栈:栈B是否为空?为空:栈A的元素往栈B中添加,从栈B出栈;不为空:直接从栈B出栈 入栈:往栈A添加元素 2、包含min函数的栈 始终能返回栈中最小值得方法。使用双栈法。用一个栈保存min值。每次添加元素时判断元素与最小值栈中栈顶元素关系,小于栈顶元素则入栈。
3、有效括号序列 双栈法。先将String中字符挨个放入栈A,开始出栈,如果是右侧括号,入栈到栈B, 如果是左括号,从栈B出栈,判断栈A与栈B顶部元素是否匹配,不匹配则失败;匹配继续往下直到栈A出栈完,最后判断栈B是否为空,不为空返回false,为空返回true