双向链表、循环链表以及循环双向链表的整理 双向链表 引言 页面的前进与回退 已知某指针q的位置,求指针p。 由于单链表节点中只有一个指向其直接后继结点的指针域,因此若已知某结点的指针域为p,找其前驱结点只能从该链表的头结点开始,顺链查找,直到找到某个结点q的直接后继为p为止。q所指的结点即为p的直接前驱,其时间复杂度为O(n)。 所以要想让其时间复杂度达到O(1),可以选择增加一个指向直接前驱的指针域。 双向链表的基本操作 //定义结构体变量 typedef struct node{ int data; //data域存放数据 str
join()源码分析--多线程设计模式(保护性暂停) join()方法用到了保护性暂停的多线程设计模式 写在前面 虚假唤醒:当前线程还未获得值,但是因为其他线程调用notify()或notifyAll()方法将其唤醒,使其错误的向下执行。 例子: public class test1 { static final Object room = new Object(); //两个状态变量 static boolean flag = false; static boolean tag = false; public static
设计模式之装饰者模式 装饰者模式和建造者模式的区别之一:装饰者模式关于组装过程的选择搭配是不确定的,可以有多种组装方式,比如穿衣服:可以先穿裤子,再穿衣服;而建造者模式的内部过程是确定的,比如建房子:得先打地基,再建房子。 装饰者模式是一种递归调用,有装饰者和被装饰者,通过组合服用来减少类继承的大的数量级。 具体例子:https://blog.csdn.net/qq_45072383/article/details/114054428 ...
可重入锁的相关疑惑 多线程可重入锁的相关疑惑 在进行多线程的相关学习时,一定要先清楚synchronized的锁的对象到底是什么。 1、synchronized修饰普通方法时,锁住的是该对象。 2、synchronized修饰代码块时,锁住的时该对象。 3、synchronized修饰被static修饰的方法时,锁住的是所有使用该类的对象。 4、synchronized修饰类时,锁住的是所有该类的对象。 为什么synchronized在存在继承关系的对象中可以锁重入进入父类的方法 比如下面这个例子 //父类 public cl
设计模式之桥接模式 桥接模式 桥接模式遵循合成复用原则,尽量使用合成聚合的方式,通过减少类的继承来降低耦合。 聚合是一种弱的拥有关系,体现在与A对象可以包含B对象,但是B对象不是A对象的一部分;合成则是一种强的拥有关系,体现了严格的部分和整体的部分,部分和整体的生命周期是一样。 关于桥接模式的案例 手机的种类繁多,不同的手机如何使用相同的功能,并且保证后续使用功能的可扩展性。 其实桥接模式就是一中解耦的方式,通过拆分不同对象的功能进行分类,然后通过组合的方式将两者关联起来,保证无论后续有多少品牌的出现,多少功能的出现,都可以很
HashMap的getOrDefault方法 getOrDefault()方法的代码如下: default V getOrDefault(Object key, V defaultValue) { V v; /*用v接受到获取的key,找到该key对应的值, 要是没有key接收到那么返回默认自己设置的参数。 */ return (((v = get(key)) != null) || containsKey(key)) ? v : de
SSM整合Swagger,小练手 SSM整合Swagger关于swagger前期准备工作 关于swagger 刚听到swagger的时候,还不知道是个啥,百度了半天,其实就是一个提供API接口展示的UI界面,swagger根据它在各个方法注解标记来在页面上展示那些方法,还能直接在页面执行这些方法,返回响应信息并在页面展示。对于后台的咱们来说,就不需要写个啥前端界面了,用来熟悉一下ssm挺好的。 前期准备工作 首先是要导入与swagger和jason相关的依赖坐标 <dependency> <groupId>
GitHub上传项目及自己出现的小问题 使用GitHub上传项目时,整个过程及遇到的错误。 首先你需要有一个github项目并创建了一个仓库,本地要安装git,这部分应该是以前弄过,不再赘述。 找到你的GitHub相应仓库,复制对应链接。 接着在桌面右键点击选项git bush here打开gitbush,用 cd 路径名 跳转至你决定用来上传的指定目录,其实在哪个目录都可以,只是在一个文件夹中专门用来管理上传比较简洁,我的话就新建了一个git/upload专门用来上传。 移动到你的指定目录之后,就可以使用git clone 上面保存的链接 将
树 对树的小小归纳树的存储双亲表示法孩子表示法孩子兄弟表示法二叉树二叉树的性质性质1性质2性质3 树的存储 因为之前就发过树的的概念啥的,所以这次就直接从树的存储开始。树的存储方式有不,我们来捋一捋(打字的时候发现的挺有趣的小东西:你能发现“一一”,“——”哪个是破折号吗1?另一个又是啥?哈哈哈)。 这里先讲一下: ABC 上图中A是双亲,B、C是孩子,其中B是左子树,C是右子树。 ABCDEFGHI...
KMP算法啊啊啊 KMP算法问题引入串引子串的存储顺序存储结构链式存储结构问题来了直观解决方案KMP算法前言next数组KMP算法改进 问题引入 串 引子 我们在生活中可以看到很多的所谓“串”,比如现在我写的这段话就是“串”,更多的,比如我们在网上查找资料,如下图: "KMP"就是一个字符串,而每次我们所搜所完之后界面显示带红色的字就是与之匹配的串,其实就是在一个串中找与之匹配的字串,我感觉搜索的想法很简单:我呈...
浅谈树与图 二叉树 二叉树的概念和特点 二叉树的递归定义:二叉树为空树,或是由一个根节点加上两棵分别为称为左子树和右子树的互不交的二叉树组成。 左子树左子树右子树右子树左子树右子树ABDECFG 二叉树的特点:1、每个节点最多只有两棵子树,及不存在结点读大于2的结点; 2、子树有左右之分,不能颠倒。 1234 1234 1234 线性结构 树型结构 第一个元素(无前驱) 根结点(无前驱) ...
模拟链表.... 模拟链表 先说句题外话:希望疫情早日接除,害! 前言 模拟链表就是用数组来模拟指针,用两个数组,一个数组data用来储存数据,数组right用来连接,其实就相当于链表里面int型变量data和结构体指针struct node *next;关于链表的相关内容我之前也写过了,有兴趣的可以点进去看看: 链表 故事开端 看完模拟链表感觉这东西真的有点玄妙…不想链表那么直接,最后我看懂之后对着书敲了一遍,本...