月度归档: 2021年9月

24 篇文章

thumbnail
LeetCode:删除链表的倒数第N个结点_19
思路 利用快慢指针,快指针先走n步,慢指针才开始走,快指针走到终点时,慢指针所在的位置就是倒数n节点。 题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗?   示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2: 输入:head = [1…
thumbnail
LeetCode:环形链表II_142
思路 环形链表_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。而上一题遍历结束时,快慢…
thumbnail
LeetCode:环形链表_141
思路 龟兔赛跑的套路,使用快慢指针,相遇即有环。 注意:是慢指针正常速度,快指针两倍速度。不是快指针正常速度,慢指针1/2速度。不然会超时 题目 给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 …
thumbnail
使用双花括号初始化集合,可别这么干
Double Brace Initialization should not be used 前言 最近在修改sonar问题时,发现有人使用双花括号初始化集合,提示可能发生内存泄漏。这种初始化方式倒是见过,只知道是使用了匿名内部类,但没有意识到这个问题。 实测 A 提供两种Map的初始化方法,为了观察是否被回收,重写了finalize方法。 pub…
HashMap源码解读:扩容
HashMap源码解读:扩容 引言 HashMap的扩容是个很重要的操作,jdk1.7往前这里会发生死链问题,都是值得研究的。我最开始以为HashMap线程不安全的原因是因为扩容,没有注意到jdk版本的影响,就去看1.8的扩容为啥会发生死链,但因此也发现了这个方法里的巧妙设计。 分析 以下这段代码是jdk1.8HashMap扩容时,遍历原HashM…
九、原型模式
Prototype Design Pattern 适用场景 创建对象过程复杂,消耗性能。但内存中已有一个对象,且字段差不多,可采用复制该对象来使用,注意深拷贝、浅拷贝。 原型模式注重的是思想,Beanutils就是原型模式的经典实现。
thumbnail
八、建造者模式
建造者模式 适用场景 创建对象的参数很多 如果参数为非必填的话,可以使用set方法,必填的通过构造方法传入,并进行校验。但是必填项很多时,构造方法的参数列表就很臃肿了。 属性之间有依赖关系 参数过多时使用set方法传入,依赖关系校验就不可控了。因为对象已经创建好了,无法控制对象使用前,是否执行了set方法。 示例 public class Reso…
LeetCode:链表的中间结点_876
思路 一次遍历链表,寻找中间节点。两个信息,一、要遍历完,二、遍历完时需要遍历到中间节点。所以需要两个指针,并且速度是1:2。注意题目要求中点为两个时,取后面个。 题目 给定一个头结点为 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。   示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 …
LeetCode:合并K个升序链表_23
思路 这题是21的升级版,从两路归并到多路归并,其中运用了优先队列来优化。感觉这题谈不上困难,只是运用了两个知识点,逻辑不复杂。 题目 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。   示例 1: 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,…
thumbnail
LeetCode:合并两个有序链表_21
思路 基础班双指针,还有归并的思想 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。    示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 = [], l2 = [] 输出:[] 示例 3: 输入:l1 = [],…