思路 这题的解法有些独特,可能是我太久没接触几何相关的问题了,要是放在初中,应该还是能想出来。 两个链表都需要遍历,很容易想到双指针。先考虑简单情况,假如两个链表长度相等。双指针同时往前走,每走一步判断下是否相等。 假如链表长度不等,双指针同时往前走就不行了,即使调整速度也不好使。我们的目的是判断两个指针是否相等,链表相交部分长度是相等的,如果末端…
思路 基础的递归思维,再一次用到了虚拟头结点。 题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head = [1,2] 输出:[2,1] 示例 3: 输入:head = [] 输出:[] 提示: 链表中节点的数目范围是…
Command Design Pattern 定义 将命令(函数)封装成对象。 实现方式 Command public interface Command { void excute(); } ReadCommand public class ReadCommand implements Command { @Override public voi…
Composite Design Patten 定义 使用树形结构来表示业务场景里的数据,业务逻辑通过递归来实现,达到简化代码的目的。 适用场景 很局限,必须能用树形结构来表示。例如人员部门的组织机构,文件系统等。 注意 递归计算时,可以考虑将结果保存起来,不用每次使用时计算。但又会引发新的问题:改变一个节点,会影响所有父节点,这时候就得权衡了。
Flyweight 定义 共享存储单元,节约内存空间。 使用场景 例如文本编辑器里,每个字符都有字体大小,显示颜色,背景颜色等属性。将这些属性抽取为字体,每个字体的属性在内存中只保留一份即可。感觉和CSS挺像的,不过享元模式侧重点不是代码复用,而是对象复用。 JDK里使用的地方 Integer缓存 int类型在自动装箱时,调用java.lang.I…
思路 利用快慢指针,快指针先走n步,慢指针才开始走,快指针走到终点时,慢指针所在的位置就是倒数n节点。 题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗? 示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2: 输入:head = [1…
思路 环形链表_141的升级版,根据上一题已经能求出快慢指针在C点相遇,接下来就是求B点。 假设环形周长为m 慢指针路程*2=快指针路程 2(AB+BC)=AB+m*n+BC 2AB+2BC=AB+m*n+BC AB+BC=m*n AB=CB+m*n m和n的值不用管,重点是一个指针从A走到B,另一个指针从C出发,走到了B。而上一题遍历结束时,快慢…
思路 龟兔赛跑的套路,使用快慢指针,相遇即有环。 注意:是慢指针正常速度,快指针两倍速度。不是快指针正常速度,慢指针1/2速度。不然会超时 题目 给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 …
Double Brace Initialization should not be used 前言 最近在修改sonar问题时,发现有人使用双花括号初始化集合,提示可能发生内存泄漏。这种初始化方式倒是见过,只知道是使用了匿名内部类,但没有意识到这个问题。 实测 A 提供两种Map的初始化方法,为了观察是否被回收,重写了finalize方法。 pub…
HashMap源码解读:扩容 引言 HashMap的扩容是个很重要的操作,jdk1.7往前这里会发生死链问题,都是值得研究的。我最开始以为HashMap线程不安全的原因是因为扩容,没有注意到jdk版本的影响,就去看1.8的扩容为啥会发生死链,但因此也发现了这个方法里的巧妙设计。 分析 以下这段代码是jdk1.8HashMap扩容时,遍历原HashM…