自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

月临水的博客

深潜、深潜,如龙在渊,不见其升,日有所增

  • 博客(137)
  • 收藏
  • 关注

原创 更改 vscode ! + table 默认生成的 html 初始化模板

自己每次都要把 <html lang="en"> 改为 <html lang="ch">太麻烦了。

2025-03-22 12:41:06 336 1

原创 SpringCloud 学习笔记3(OpenFeign)

OpenFeign 是一个声明式的 Web Service 客户端。它让微服务之间的调用变得更简单。

2025-03-18 16:38:40 1060 1

原创 SpringCloud 学习笔记2(Nacos)

Nacos 的服务实例类型分为临时实例和非临时实例。临时实例(默认类型):实例处于不健康状态超过一定时长,会被从服务列表删除。临时实例采用的是客户端主动上报机制。非临时实例(也叫做永久实例):实例哪怕一直处于不健康状态,也不会被删除。非临时实例采用的是服务器反向探测机制。非临时实例设置方法:在配置文件中添加spring:cloud:nacos:discovery:# false 表示修改为非临时实例。

2025-03-17 18:03:41 793

原创 SpringCloud 学习笔记1(Spring概述、工程搭建、注册中心、负载均衡、 SpringCloud LoadBalancer)

微服务是一种经过良好架构设计的分布式架构方案。一个服务只对应一个单一的功能,只做一件事,这个服务可以单独部署运行。Spring Cloud 是一套基于的微服务开发工具集,用于简化分布式系统(如微服务架构)的构建、部署和管理。它整合了多种开源组件,提供了一站式解决方案,帮助开发者快速实现服务治理、配置管理、负载均衡、熔断降级等分布式系统中的常见问题。简单的说,Spring Cloud 就是分布式微服务架构的一站式解决方案。有没有什么办法来解决这个问题呢?

2025-03-14 22:48:15 1316 1

原创 博客系统笔记总结 2( Linux 相关)

: 表示把 “|” 前面命令的输出,作为"|"后面命令的输入。例:输入 ps -ef | grep “redis” 这条命令前半部分的含义是 查看当前系统上运行的所有进程。后半部分的含义是 查找 带 “redis” 的文件。组合起来就是 查找当前系统上运行的进程名字带 “redis” 的进程。apt 是啥呢?它就跟手机上的应用商店一样,你可以在上面下载各种软件。在 linux 中主要有两种下载软件包的方法,一个是去官网下载,另一个就是用 apt 下载。

2025-02-25 15:31:46 1389 1

原创 博客系统笔记总结(1)

token 不是加密的。token 不能伪造。在下图中,红色的是请求头(Header),紫色的是数据(Payload),蓝色的是签名(Signature)。Header : 描述 token 类型和签名算法。Payload : 携带的实际数据。Signature : 对 Header 和 Payload 的加密签名。token不能伪造的原因?token 之所以不能伪造,核心原因在于其数字签名机制。将 Header 和 Payload 用 Base64 编码。

2025-02-25 15:28:51 692

原创 解决出现:Field blogInfoMapper in com.example.springbootblog.service.impl.BlogServiceImpl required a bean

解决出现:Field blogInfoMapper in com.example.springbootblog.service.impl.BlogServiceImpl required a bean的问题

2025-02-19 19:37:54 339 1

原创 解决 .yml 文件中文乱码问题

但是按照下面的方法设置,以后就不会乱码了~到这里,只是把当前项目设置好了。已经乱码的恢复不了了。到这里就全部设置好了~本文到这里就结束啦~

2024-11-09 00:14:20 697 17

原创 算法: 链表题目练习

可以引入一个头结点便于处理边界情况方便我们对链表操作在插入新节点时,可以先把新节点的指针指向都调整好.然后再去调整前一个节点和后一个节点.或者直接新建一个指针,指向后一个节点,这样更容易操作~有时候会用到快慢双指针本文到这里就结束啦~

2024-11-05 17:26:30 1068 24

原创 JavaEE: 点亮你的JVM之旅(8000字、较全讲解)

在运行 Java 进程的时候,JVM需要读取 .class 中的内容,并且执行里面的指令。JVM需要读取 .class 中的内容,这个就是类加载,把类涉及到的字节码从硬盘读取到内存中(元数据区),也就是把这个 .class 中的指令变成类对象。基于类对象,就可以创建该类的实例。类对象其实就是“对象”的说明书 / 蓝本。因为有了类对象,所以才能进行反射,反射的各种 api 都是从类对象中拿到信息的。

2024-11-04 08:45:00 1168 16

原创 算法: 分治题目练习

下面的代码(快排主逻辑)多看几遍, 写熟.// 快排优化: 指定一个随机数作为基准值elsei++;归并排序很简单~把数组分成两个区间.分别给左右两个区间排序.合并两个有序数组.把排序后的结果还原到数组中.本文到这里就结束啦~

2024-10-22 17:31:55 3383 44

原创 算法: 模拟题目练习

模拟题目练习: 替换所有的问号 提莫攻击 Z 字形变换 外观数列 数青蛙

2024-10-19 22:09:36 1692 21

原创 算法: 位运算题目练习

基础位运算> 右移~ 按位取反. 记忆方法: 0 变 1, 1 变 0.& 按位与. 记忆方法: 有 0 就是 0.| 按位或. 记忆方法: 有 1 就是 1.^ 按位异或. 记忆方法: 相同为0,相异为一. 无进位相加.给一个数 n,确定它的二进制表示中的第 x 位是 0 还是 1.将一个数 n 的二进制表示中的第 x 位修改成 1.将一个数 n 的二进制表示中的第 x 位修改成 0.位图提前一个数 n 的二进制表示中的最右侧的 1n & - n。

2024-10-13 12:28:10 4625 41

原创 算法: 前缀和题目练习

我的第一反应是想用一个sum计算所有元素的和,然后除 2 得到 target,接着再使用滑动窗口寻找这个target , 发现行不通,因为数组中可能有负数和0~这一次 HashMap 中存的就不是数字出现的次数了,而是数字出现的下标.在往二维数组存数据的时候,内层循环用错了,应该用 m,而不是 n.因为数组中的元素有小于等于0的数,所以不能使用滑动窗口来解题~dp[i][j] 计算的是它左上方所有元素的和(包括自己)~在最后计算结果的时候,最开始没有算的太明白.没写出来,但是写了个大概,就差一点,

2024-10-11 00:24:02 2162 21

原创 JavaEE: HTTPS的魅力与优势揭秘

但实际上,事情没这么简单,我们知道,服务器在同一时刻会给多个客户端提供服务.这么多客户端,每个人用到秘钥必须是不同的(如果是相同的,那么秘钥也能被黑客拿到了~),因此服务器就需要维护每个客户端和每个秘钥之间的关联关系.这是一个麻烦的事情.你使用 Fiddle 的时候,Fiddle 就在对你进行中间人攻击(在开启 HTTPS 选项的时候,弹出来一个框,是否要信任 Fiddle 提供的证书,点击 Yes,表示你允许fiddle对你进行攻击了~).答: 这在理论上不可行!

2024-10-09 22:25:48 5077 14

原创 JavaEE: 深入解析HTTP协议的奥秘(3)

解决方案: 同时开发出多个不同版本的页面(有的只有文字图片,有的包含复杂多媒体),判断 UA 字段,通过 UA 获取到用户的浏览器信息和操作系统信息,这样就可以判定当前用户的浏览器版本都支持哪些特性,从而展示对应的页面.虽然不能直浏览器禁止网页接访问硬盘,但是浏览器允许通过键值对的方式来存储数据(这样的数据本质上也是在硬盘上),具体这样的键值对是如何存储到硬盘上的,浏览器封装好,网页本身无法干预.当年的上网设备,进化速度非常快,同一时刻,会有很多种不同的设备都在被各种用户使用.

2024-10-08 17:51:57 2275 19

原创 JavaEE: 深入解析HTTP协议的奥秘(2)

像 /?: 等这样的字符,已经被 url 当做特殊意义理解了.因此这些字符不能随意出现.如果某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义.一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成,虽然在 URL 中没有特殊含义,但是仍然需要进行转义.否则浏览器可能吧 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号.

2024-10-07 19:37:03 2020 19

原创 JavaEE: 深入解析HTTP协议的奥秘(1)

因为 1.1 版本就足够好用了,升级到 2.0 成本比较高(浏览器/服务器的兼容性),带来的收益有限.答: 体积小了,传输时消耗的带宽就低了,带宽是互联网中最贵的硬件资源,比 cpu,内存都要贵~HTTP 一般来说,GET 往往是不带 Body. POST 往往是带 Body 的.响应这里打开,看到的是二进制.(本身相应也是文本,此处的二进制,是压缩后的)HTTP不仅仅能传输文本,还能传输图片,传输音频文件,传输其他的各种数据.HTTP 协议,是一种典型的"一问一答"的协议.

2024-10-07 14:48:28 2224 15

原创 JavaEE: 数据链路层的奇妙世界

IP地址和mac地址,是两伙人,同一个时间段,各自独立搞出来的,两边都觉得自己的东西好,于是就综合一下,你这个地址负责这块,你那个地址负责那块就可以了~理论上来说,搞一套地址,也能完成宏观和微观上层次的所有工作,IP地址和mac地址留一组就可以了.但是实际上两个都留了下来,分配了不同的任务.最典型的就是IP协议,IP协议能拆包组包,其实IP协议的拆包组包,不是应对IP的64kb,更多的是应对MTU的限制.MTU和硬件直接相关,不同的硬件设备,就对应到了不同的数据链路层协议,也就对应到了不同的 MTU .(

2024-10-06 17:01:03 1435 13

原创 算法: 二分查找题目练习

可以使用二分查找.把区间划分成两个部分, 1. num[mid] < t , num[mid] >= t .把区间划分成 num[mid] < t 和 num[mid] > t ,这谁都懂,就不说了.关键是 “=” 给谁?左边还是右边?

2024-10-05 21:05:34 2118 10

原创 JavaEE: 探索网络世界的核心-IP协议

13位分片偏移: 是分片相对于原始IP报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置.实际偏移的字节数是这个值 * 8 得到的.因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了).我们知道,IP地址(IPv4)是一个4字节32位的正整数,那么一共只有2的32次方个IP地址,大概是42亿九千万左右.而TCP/IP协议规定,每一个主机都需要有一个IP地址.16位标识: 一个大的数据,拆成多个IP数据报传输,此时这多个IP的数据报的16位标识,就是相同的值.

2024-09-28 17:29:20 2982 26

原创 算法: 滑动窗口题目练习

做这道题时,脑子里大概有个印象,知道要用滑动窗口,但是对于滑动窗口为什么就对,不会落情况吗?对于这一点不是很清楚.看完题解,发现我的代码只需要把一个if改成while就能过了,而且速度很快…刚开始写时没写对,后来画了两次图,根据图,然后就写出来了~看了题解,跟我写的差不多,但是我写的还有可以优化的地方.

2024-09-26 15:30:44 2615 26

原创 MySQL: 数据类型介绍

DECIMAL(M,D) 不再使用IEEE754这一套了,而是自己设定了一套存储格式,自己设定的这个存储格式,相当于"变长的",付出了更多的空间,来使存储的数据更精确.其实MySQL的类型中也提供了"无符号类型",但是在MySQL官方文档中,明确说明了,不建议使用无符号类型.甚至无符号类型可能会在未来的更高版本的MySQL中被删除掉.如果接下来存储的数据都是5,6个字节这种,这时每个字段都是消耗50字节,实际上只用上了5,6个字节,剩下的都还空着呢!比如定义类型的时候,写作double(3,1).

2024-09-25 16:17:17 2917 19

原创 JavaEE: 深入探索TCP网络编程的奇妙世界(六)

A触发超时重传,重传的数据,当然还是没有响应.反复多次之后,A尝试重置连接(rst),重置操作也没有ack,A就会单方面释放连接(A把保存的B的信息删除掉)存在很多种读法,但是实际上,aaa,bbb,ccc这才是正确的读法,aaa,bbb,ccc才是完整的"应用层数据包".这样的探测报文,是周期性的,同时这个报文是用来探测对方的"生死"的,也就把这样的报文称为"心跳包".而紧急指针,就是让后面的数据插队,根据紧急指针的偏移量,把指定位置的数据,优先发送出去.

2024-09-23 20:29:15 2500 23

原创 JavaEE: 深入探索TCP网络编程的奇妙世界(五)

因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵,在不清楚当前网络的状态下,贸然发送大量的数据,可能导致雪上加霜.虽然有了TCP滑动窗口这个大杀器,能够高效可靠的发送大量数据,但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题.一定要记得,窗口越大,网络吞吐量就越大,传输效率就越高,我们的目标是在保证网络不拥塞的情况下尽量提高传输效率~捎带应答是在延时应答的基础上,引入的提升效率的机制,它可以把返回的业务数据,和ACK两者合二为一.正常情况下,ack和响应,是不同的时机返回的,无法合并.

2024-09-23 00:35:35 2499 13

原创 JavaEE: 深入探索TCP网络编程的奇妙世界(四)

窗口大小指的是无需等待确认应答而可以继续发送数据的最大值,上图的窗口大小就是4000个字节(四个段).发送前四个段的时候,不需要等待任何ACK,直接发送.操作系统为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答,只有确认应答过的数据,才能从缓冲区删掉.窗口越大,则网络的吞吐率就越高.

2024-09-22 17:49:14 2293 9

原创 JavaEE: 深入探索TCP网络编程的奇妙世界(三)

给每个连接,都协商不同的起始的序号,如果发现收到的数据,和起始序号以及和最近收到的数据序号,都差别很大的话,那么就视为这个数据就是"前朝"的数据,把它丢掉.对于三次挥手来说,中间的两次,ACK+SYN,都是在系统内核中,由操作系统负责进行的,时机都是在收到SYN之后,就可以合并了.TCP通信时,起始数据的序号,就是通过三次握手,来协商确定的~(换而言之,TCP序号,并不是从1开始的)ACK是内核控制的,但是FIN的触发,则是通过应用程序,调用close/进程退出,来触发的.

2024-09-22 08:43:50 2173 12

原创 JavaEE: 深入探索TCP网络编程的奇妙世界(二)

接收方有一个接收缓冲区,收到的数据先进入到缓冲区里,等后续再收到数据,就会根据序号,在缓冲区中,找对应的位置(排序),如果发现,当前序号1-1000这个数据,已经在缓冲区中存在了,那么就会直接把新收到的这个1-1000数据包丢弃掉~反之,如果重传几次,都没有顺利到达,这就说明网络的丢包率已经到达了一个非常高的程度,网络发生了严重故障,大概率没法继续使用了.发送方第一次重传,超时时间是 t1 ,如果重传之后,仍然没有ack,还会继续重传,此时的超时时间就变成了 t2.

2024-09-21 13:47:43 2259 19

原创 JavaEE: 深入探索TCP网络编程的奇妙世界(一)

16位校验和: 发送端填充,CRC校验.接收端校验不通过,则认为数据有问题,此处的校验和不光包含TCP首部,也包含TCP数据部分.为了解决上述问题,TCP就针对接收方收到的数据,进行了重新排序.确保应用程序读取到的数据一定是和发送方的数据顺序是一致的!收到的数据,就会先在接收缓冲区中排队等待,直到开头的数据到了,应用程序才能真正读取到里面的数据~虽然朋友先发的"好啊",后发的"不行,有事",但是网络传输过程中,可能存在"后发先至".当然不是,首先,TCP进行传输时,一次传输的基本单位不是一个TCP数据报.

2024-09-21 11:18:49 2660 12

原创 算法:双指针题目练习

一般是在数组中使用,通常需要对数组进行排序.数据要有单调性.使用双指针可以把时间复杂度降一维.O(n^3)变O(n^2)。

2024-09-19 18:57:19 1120 22

原创 JavaEE:探索网络世界的魅力——玩转UDP编程

更具体一点,就是把UDP数据报里的整个数据,都进行遍历,分别取出每个字节,往一个两个字节的变量上进行累加,由于整个数据可能很多,加着加着可能使结果溢出了,但是溢出也没关系,重点不在于最终的和是多少,而是关心校验和结果是否会在传输过程中发生改变.作为一个"网络协议"不是单方面修改就可以的,即使修改了你的服务器的内核中UDP的实现,可是,客户端那边,用户的电脑上,咋办?校验和可以在要传输的数据中,引入额外信息,用来发现/纠正传输数据的错误.在计算校验和的过程中,是否可能出现两个不同的数据,生成的校验和相同呢?

2024-09-19 15:09:52 2344 9

原创 JavaEE: 创造无限连接——网络编程中的套接字

为了方便程序员操作网卡,操作系统就把网卡这个概念给封装成Socket,应用程序员就不必关注硬件的差异和细节,只需要操作Socket对象就能间接的操作网卡.需要注意的是,接下来要说的都是操作系统提供的Java版本的Socket api.不是系统原生的api,而是JDK封装好的!不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的.UDP是面向数据报,UDP这里需要定义专门的类,来表示UDP数据报,作为UDP传输的基本单位。

2024-09-18 16:48:46 2493 16

原创 JavaEE: 深入网络编程的必备知识

网络互联的目的是进行网络通信,也是网络数据传输,更具体一点,是网络主机中的不同进程间,基于网络传输数据.那么,在组建网络的过程中,如何判断到底是从哪台主机,将数据传输到哪台主机呢?这就需要使用IP地址来标识.IP地址主要用于标识网络主机,其他网络设备(如路由器)的网络地址,简单说,IP地址用于定位主机的网络地址.IP地址是一个32位的二进制数,通常被分割为个"8位二进制数"(也就是4个字节).通常用"点分十进制"的方式来表示,即a.b.c.d的形式(a,b,c,d都是0-255之间的十进制整数)在网络通信

2024-09-14 08:19:19 2097 32

原创 JavaEE: 实战文件操作技巧!

比如,我们自己的代码中,产生大量的日志,把这些日志,导入到自己搭建的搜索引擎中(用到一些业界成熟的方案,比如ES这种),从而快速查找~其中最核心的优化,就是引入了神奇的数据结构"倒排索引".提前把所有的文件里面的内容都分析好,分析出一个文件中,包含哪些词~这种思路,不能适应频繁查询的场景,也不能适应目录中文件数目特别多,特别大的场景.此处这里的代码逻辑,效率是非常低的,每次查询,都会涉及到大量的硬盘IO操作.搜索引擎在进行搜索的过程,也就是在文件中查找内容是否被包含的过程.进行普通文件的复制.

2024-09-12 08:41:04 1908 35

原创 JavaEE:玩转文件内容操作(二)

我们所谓的读文件,其实就是把文件的内容从硬盘存到内存中.read()方法可以实现读文件这样的操作.read的官方文档说明:解释一下:read操作可以返回当前的一个字节,它会按照int的类型来返回,但是呢,这个int的范围只能是0~255.如果没有字节可以去读,也就是文件读取完毕的时候,就会返回-1.之所以不使用byte,是因为当前这里的返回值要能够表示-1这种"特殊情况"(byte没法表示).写文件,和读文件非常相似.

2024-09-11 21:35:34 2434 26

原创 JavaEE:文件内容操作(一)

文件描述符:描述了1该进程,都要操作那些文件,文件描述符,可以认为是一个数组,数组的每个元素就是一个struct file对象(Linux内核),每个结构体就描述了对应操作的文件的信息,数组的下标,就称为"文件描述符".刚才说的close是释放文件描述符表里的元素,进程结束,意味着PCB就真个销毁,PCB上的文件描述符,就会整个释放.除非主动调用close,关闭文件,此时,才会释放出空间.如果代码里一直打开,不去关闭,就会使这里的资源越来越少.打开文件实际上实在该进程的文件描述符中,创建了一个新的表项.

2024-09-11 15:44:44 2114 23

原创 JavaEE:轻松处理文件操作的神器——File介绍

属性这个表格描述了文件路径的分隔符,由于这个分隔符在不同的系统上是不一样的.我们就可以通过上面的属性来做到平台无关化.构造方法在这些构造方法中,我们主要来谈第二个版本,使用String作为路径,我们可以往里面传入绝对路径,也可以传入相对路径.也可以指定一个不存在的路径.如果传入的是一个不存在的路径,那么后续对该路径执行的操作(如创建文件或目录)会创建一个新的文件或目录。方法下面列出了一系列关于File的操作.getParent()可以返回File对象的父目录文件路径.

2024-09-09 22:17:22 2052 28

原创 JavaEE:多线程进阶(线程安全的集合类)

小小的补充,在往上查一些关于ConcurrentHashMap的资料的时候,可能会见到"分段锁"这样的说法.它属于ConcurrentHashMap早期的实现方式,它与现在的锁桶,思想上是一样的,但是实现上有差别.写实拷贝介绍:当我们往一个容器添加元素的时候,不直接往当前容器内添加,而是先将当前容器Copy,复制出一个新的容器,然后在新的容器里添加元素.添加完元素之后,再将原容器的引用指向新的容器.对于读操作,它是通过volatile以及一些精巧的代码来实现的.确保读操作,不会读到"修改一半的数据".

2024-09-09 09:51:33 2279 32

原创 JavaEE:多线程进阶(JUC [java.util.concurrent] 的常见类)

JUC的全称为: java.util.concurrent.JUC是Java并发工具包的一部分。它提供了一组并发编程工具和类,用于处理多线程编程和并发任务。

2024-09-08 15:11:48 1952 20

原创 JavaEE:多线程进阶(CAS)

CAS: 全称Compare and swap,字面意思:”比较并交换“,一个 CAS 涉及到以下操作:我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。比较 A 与 V 是否相等。(比较)如果比较相等,将 B 写入V。(交换)返回操作是否成功。ABA问题:假设存在两个线程t1和t2,有一个共享变量num,初始值为A.接下来,线程t1想使用CAS把num的值改成Z,那么就需要先读取num的值,记录到oldNum变量中。

2024-09-05 16:45:51 2421 31

Web前端开发基础入门-张颖,书上全部代码

Web前端开发基础入门-张颖,书上全部代码,Web前端开发基础入门-张颖,书上全部代码,Web前端开发基础入门-张颖,书上全部代码,Web前端开发基础入门-张颖,书上全部代码,Web前端开发基础入门-张颖,书上全部代码,Web前端开发基础入门-张颖,书上全部代码,Web前端开发

2024-11-11

Web前端开发基础入门,书上示例

Web前端开发基础入门,书上示例.

2024-09-09

使用Java实现平衡二叉树(AVL树)

这段 Java 代码实现了一个 AVL 树(平衡二叉搜索树)的数据结构。 **类和内部类**: * `AVLTree`:主类,包含 AVL 树的操作方法和属性。 * `TreeNode`:内部类,代表 AVL 树的节点,包含节点值、左右子树指针、父节点指针和平衡因子。 **方法**: * `insert`:向 AVL 树中插入节点。在插入过程中,通过调整平衡因子来保持树的平衡。如果插入后导致不平衡,会进行相应的旋转操作(左单旋、右单旋、左右双旋、右左双旋)。 * `rotateLeft`:左单旋操作,用于调整树的结构以恢复平衡。 * `rotateRight`:右单旋操作,与左单旋类似。 * `rotateLR`:左右双旋操作。 * `rotateRL`:右左双旋操作。 * `inorder`:中序遍历 AVL 树并打印节点值。 * `height`:计算以给定节点为根的子树的高度。 * `isBalanced`:检查以给定节点为根的子树是否平衡,通过比较左右子树高度差和节点的平衡因子,并递归检查子树。 AVL 树是一种自平衡的

2024-08-03

使用Java实现无头双向链表

这段代码实现了一个无头双向链表(Doubly Linked List)。无头双向链表是一种链表数据结构,其中每个节点不仅包含指向下一个节点的指针(`next`),还包含指向前一个节点的指针(`prev`)。这种结构使得链表在某些操作上更加高效,例如在链表中间插入或删除节点。 以下是对代码中各个方法的详细解释: ### 类定义 public class LinkedList { private int val; private LinkedList next; private LinkedList prev; public LinkedList head; public LinkedList tail; public LinkedList() { } public LinkedList(int val) { this.val = val; }

2024-08-03

使用Java实现二叉搜索树

这段代码展示了构建一个基本的二叉搜索树(Binary Search Tree, BST)的实现。二叉搜索树是一种特殊的二叉树,其中每个节点的值大于其左子树中所有节点的值,并且小于其右子树中所有节点的值。这种数据结构在查找、插入和删除操作中非常高效。 类定义:BinarySearchTree 这个类定义了一个二叉搜索树,其中包含一个内部类 TreeNode 用于表示树中的节点。每个节点包含以下属性: val:节点的值。 left:指向左子节点的引用。 right:指向右子节点的引用。 方法定义: insert(int val) 插入一个新值到二叉搜索树中。如果树为空,新节点将成为根节点。否则,从根节点开始,根据值的大小递归地移动到适当的位置插入新节点。 search(int key) 查找树中是否存在给定的键。从根节点开始,根据键值与节点值的比较,递归地在左子树或右子树中查找。如果找到匹配的键,则返回对应的节点;否则返回 null。 remove(int key) 删除树中值为 key 的节点。首先查找该节点,然后根据节点的子节点数量来决定如何删除:如果节点没有子节点、有一个子节

2024-08-03

简单的通讯录实现(C语言)(内含文件操作)

简单的通讯录实现(C语言)(内含文件操作)

2024-03-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除