当前位置: 首页 > news >正文

【数据结构】:用Java实现链表

image.png

ArrayList 任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为 O(n),效率比较低,因此 ArrayList 不适合做任意位置插入和删除比较多的场景。因此:java 集合中又引入了 LinkedList,即链表结构。


概念

顺序表是物理上连续,逻辑上也是连续的
链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。

链表是由一个一个的节点组织起来的,整体的组织就叫链表
image.png
注意:

  1. 从上图可看出,链式结构在逻辑上是连续的,但在物理上不一定连续
  2. 现实中的节点一般都是从堆上申请出来的
  3. 从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续

节点可以认为是节点对象,对象里面有两个节点属性,val 用来存储数据,next 用来存储下一个节点的地址


分类

链表

  1. 单向/双向image.png|404
  2. 带头/不带头: 带头就是带一个头节点,头结点的数据域可以不存储任何信息,也可以用来存储一些附加信息,如链表的长度等。 image.png|416
  3. 循环/不循环: 循环就是将最后一个节点里面地址改为第一个节点的地址 image.png|390

链表结构

  1. 单向带头循环
  2. 单向带头非循环
  3. 单向不带头循环
  4. 单向不带头非循环(重点)image.png|470
  5. 双向带头循环
  6. 双向带头非循环
  7. 双向不带头循环
  8. 双向不带头非循环(重点)

链表的实现

链表的构造

节点的构造和连接

如何构造节点?

  • 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部食物提供服务,那么这个内部类的完整结构最好使用 内部类
  • 因为链表是由若干节点组成,而节点又是一个完整的结构,所以将节点定义为内部类。其最少有两个域,一个是数值域,一个是 next域,且 next 的类型为节点类型
  • 最后对节点进行构造,只需要实例化这个内部类的对象即可,实例化出来的对象便是节点
class ListNode {  public int val;  public ListNode next;  public ListNode(int val) {  this.val = val;  }
}public ListNode head;  public void createList() {  ListNode node1 = new ListNode(12);  ListNode node2 = new ListNode(23);  ListNode node3 = new ListNode(34);  ListNode node4 = new ListNode(45);  ListNode node5 = new ListNode(56);    
}

如何让它与第一个节点相关联?

  • 通过访问 node1 存储地址的变量 next,将其的值赋为下一个节点的地址
  • 以此类推
  • 最后让头节点指向第一个节点 node1
node1.next = node2;  
node2.next = node3;  
node3.next = node4;  
node4.next = node5;  this.head = node1;

createList 方法走完之后,实例化的各个节点对象就没有了,只保留了一个 head 对象
因为这些都是局部变量,方法调用完成之后,局部变量就被回收了
但不代表节点就没人引用了,他们被地址引用,谁引用了他们的地址,谁就引用他们



链表的功能

void display()——遍历链表

  • head == null 的时候,链表就遍历完了。若写成 head.next == null,则不会打印出最后一个节点的数据
  • 要从第一个节点走到第二个节点,只需要 head == head. next 即可。
  • 但若想完成多次打印,head 的位置就不能变,需要一直在首位,所以我们就定义一个 cur 节点,来做 head遍历工作head 只负责 站在最前面定位 即可

node 中的数据与其是否为 null 是两个独立的概念。在编程和数据结构中,node 通常是一个对象或结构,它包含数据字段和一个或多个指向其他节点的指针或引用。

  • 当我们说 node != null 时,我们是在检查 node 这个变量是否指向了一个有效的内存地址,即它是否已经被初始化并且分配了内存。
  • node 中的数据字段可以包含任何类型的值,包括 null(如果数据字段的类型允许)。但是,即使数据字段是 nullnode 本身仍然可以是一个有效的对象,只是它的数据字段没有包含有用的信息。

因此,node != null 并不表示 node 中的数据一定非空或有效。它只表示 node 这个变量已经指向了一个在内存中的对象

//遍历链表
public void display() {  ListNode cur = head;  while (cur != null) {  System.out.print(cur.val + " ");  cur = cur.next;  }    System.out.println();  
}

int size()——求链表长度

  1. 定义一个 count 变量,用来记录 cur 向后走的次数
  2. 每向后走一步,count++

不能写成:cur.next != null,因为最后一个节点的 next 为空,若是这样判断的话最后一个节点就不会进循环了,就会少算一个

//计算链表长度  
public int size() {  int count = 0;  ListNode cur = head;  while (cur != null) {  count++;  cur = cur.next;  }    return count;  
}

void addFirst(int val)——头插法

  1. 将此时头结点的地址传给 node 的 next 变量
  2. 将头节点前移到 node 的地方

这里两步的顺序不可以交换,不然就是自己指向自己了
插入节点的时候,一般先绑后面,再插入前面

//头插  
public void addFirst(int val) {  ListNode node = new ListNode(val);  node.next = head;  head = node;  
}

void addLast(int val)——尾插法

  1. 为了避免产生空指针异常报错,我们先对 head == null 的情况进行讨论
    • 若头节点为空,则 head = node;
    • 记得加上 return,否则程序会继续执行下去
  2. 若链表不为空,找到链表的尾巴
    • cur. next == null 时,cur 指向的就是尾巴
  3. 最后让 head.next == node; 即可

//尾插  
public void addLast(int val) {  ListNode node = new ListNode(val);  if (head == null) {  head = node;  return;  }    ListNode cur = head;  while (cur.next != null) {  cur = cur.next;  }    cur.next = node;  
}

void addIndex(int index, int val)——在任意位置插入

  1. 判断 index 的合法性
    1. 定义一个 checkIndex(int index) 方法用来检查 index 的合法性
    2. 若不合法,则抛出一个自定义异常:IndexNotLeagalException
  2. index == 0 || index == size();
    1. 前者相当于是头插,直接调用 addFirst()
    2. 后者相当于是尾插,直接调用 addLast()
  3. 找到 index 的前一个位置
    1. 创建一个 findIndexSubOne(int index) 方法
    2. 创建一个节点 cur 来接收调用方法的返回值
    3. 最后 cur 就是 index 位置的前一个节点了
  4. 进行连接
    1. 实例化一个所带数据为 val 的节点 node
    2. node.next = cur.next;
    3. cur.next = node;

image.png|523

//在任意位置插入  
public void addIndex(int index, int val) {  //1. 判断index的合法性  try {  checkIndex(index);  } catch (IndexNotLegalException e) {  e.printStackTrace();  }  //2. index == 0 || index == size()  if(index == 0){  addFirst(val);  return;  }    else if(index == this.size()){  addLast(val);  return;  }  //3. 找到 index 的前一个位置  ListNode cur = findIndexSubOne(index);  //4. 进行连接  ListNode node = new ListNode(val);  node.next = cur.next;  cur.next = node;  
}  //用来检查输入的 index 是否合法的方法
public void checkIndex(int index) {  if(index < 0 || index > size()){  //若不合法则抛出一个异常throw new IndexNotLegalException("index位置不合法");  }
}  //用来找到 index 前一位对应的节点的函数
private ListNode findIndexSubOne(int index) {  ListNode cur = head;  for (int i = 0; i < index - 1; i++) {  cur = cur.next;  }    return cur;  
}

boolean contains(int val)——链表中是否包含某个元素

  1. 遍历链表
  2. 若能在链表元素中找到 val 值,则返回 true
  3. 否则返回 false

//判断链表中是否包含某个元素  
public boolean contains(int val) {  ListNode cur = head;  while(cur != null){  if(cur.val == val){  return true;  }    }    return false;  
}

void remove(int key)——删除第一次出现的关键字的节点

  1. 首先判断是否为空链表
  2. 遍历链表
    • 循环条件为:cur.next != null
  3. 找到 val 值的前一个节点 cur
    • cur.next.val == val 时,找到目标
  4. 进行删除
    • 找到之后,将其创建为 del 节点
    • cur.next = del.next 或者 cur.next = cur.next.next
    • 看表达式可知,删除的判断是从第二个元素开始的,无法对第一个元素进行判断,所以需要针对第一个元素再加上一个删除判断:head.val == val

//删除第一次出现的关键字的节点  
public void remove(int val) {  //链表为空  if(head == null){  return;  }    //当第一个元素就为 val    if(head.val == val){  head = head.next;  return;  }  ListNode cur = head;  while(cur.next != null){  if(cur.next.val == val){  ListNode del = cur.next;  cur.next = del.next;  }        cur = cur.next;  }
}

void removeAll(int val)——删除所有出现的关键字的节点

在原有的链表上进行修改
只遍历一遍链表

  • 定义两个引用变量
    • cur 代表当前需要删除的节点
    • prev 代表当前需要删除节点的前驱
  1. cur.val == val
    1. prev.next = cur.next
    2. cur = cur.next
  2. 否则:
    1. prev = cur
    2. cur = cur.next
  3. 处理头节点

//删除所有出现的关键字节点  
public void removeAll(int val) {  //1. 判空  if (head == null) {  return;  }  //2. 定义 prev 和 cur    ListNode prev = head;  ListNode cur = head.next;  //3. 开始判断并删除  while (cur != null) {  if (cur.val == val) {  prev.next = cur.next;  } else {  prev = cur;  }        cur = cur.next;  }    //4. 处理头结点  if (head.val == val) {  head = head.next;  }
}

void clear()——清空

回收对象,防止内存浪费

head = null

//清空链表  
public void clear() {  head = null;  
}

相关文章:

【数据结构】:用Java实现链表

在 ArrayList 任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后搬移&#xff0c;时间复杂度为 O(n)&#xff0c;效率比较低&#xff0c;因此 ArrayList 不适合做任意位置插入和删除比较多的场景。因此&#xff1a;java 集合中又引入了 LinkedList&…...

前端开发知识(三)-javascript

javascript是一门跨平台、面向对象的脚本语言。 一、引入方式 1.内部脚本&#xff1a;使用<script> &#xff0c;可以放在任意位置&#xff0c;也可以有多个&#xff0c;一般是放在<body></body>的下方。 2.外部脚本&#xff1a;单独编写.js文件&#xff…...

Windows图形界面(GUI)-MFC-C/C++ - MFC绘图

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 MFC绘图 绘图基础 CPaintDC 实例代码 MFC绘图 绘图基础 设备上下文&#xff08;Device Context, DC&#xff09;: 设备上下文是一个Windows GDI&#xff08;图形设备接口&#xff09…...

51单片机-第五节-串口通信

1.什么是串口&#xff1f; 串口是通讯接口&#xff0c;实现两个设备的互相通信。 单片机自带UART&#xff0c;其中引脚有TXD发送端&#xff0c;RXD接收端。且电平标准为TTL&#xff08;5V为1,0V为0&#xff09;。 2.常见电平标准&#xff1a; &#xff08;1&#xff09;TTL电…...

【Linux常用命令】之df命令

Linux常用命令之df命令 文章目录 Linux常用命令之df命令常用命令之df背景介绍 总结 作者简介 听雨&#xff1a;一名在一线从事多年研发的程序员&#xff0c;从事网站后台开发&#xff0c;熟悉java技术栈&#xff0c;对前端技术也有研究&#xff0c;同时也是一名骑行爱好者。 D…...

2024年起重信号司索工(建筑特殊工种)证模拟考试题库及起重信号司索工(建筑特殊工种)理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年起重信号司索工(建筑特殊工种)证模拟考试题库及起重信号司索工(建筑特殊工种)理论考试试题是由安全生产模拟考试一点通提供&#xff0c;起重信号司索工(建筑特殊工种)证模拟考试题库是根据起重信号司索工(建筑特…...

AWS全服务历史年表:发布日期、GA和服务概述一览 (全)

我一直在尝试从各种角度撰写关于Amazon Web Services&#xff08;AWS&#xff09;的信息和魅力。由于我喜欢技术历史&#xff0c;这次我总结了AWS服务发布的历史年表。 虽然AWS官方也通过“Whats New”发布了官方公告&#xff0c;但我一直希望能有一篇文章将公告日期、GA日期&…...

Leetcode 2824. 统计和小于目标的下标对数目

2824. 统计和小于目标的下标对数目 2824. 统计和小于目标的下标对数目 一、题目描述二、我的想法 一、题目描述 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target &#xff0c;请你返回满足 0 < i < j < n 且 nums[i] nums[j] < target 的下标对…...

TCP服务器主动断开客户端

自定义消息函数 afx_msg LRESULT CbaseMFCprojectDlg::OnOnsocketbartender(WPARAM wParam, LPARAM lParam) WPARAM wParam:消息来源 res recv(wParam, cs, 65535, 0);获取这个客户端端口socket通道里面的信息长度为65535存放在cs里面 如果获取得到res0即是说明该客户端已经断…...

接口自动化中json.dumps()跟json.loads()区别详解

接口自动化中对于参数处理经常会用到json.dumps()跟json.loads(),下面主要分享一下自己使用总结 1.主要区别 json.dumps() 用于将字典转换为字符串格式 json.loads()用于将字符串转换为字典格式 import jsondict1 {"name":"amy","gender":woma…...

计算机网络-配置双机三层互联(静态路由方式)

目录 交换机工作原理路由器工作原理路由信息表组成部分路由器发决策 ARP工作原理配置双机三层互联&#xff08;静态路由方式&#xff09; 交换机工作原理 MAC自学习过程 初始状态&#xff1a; 刚启动的交换机的MAC地址表是空的。 学习过程&#xff1a; 当交换机收到一个数据帧…...

ES(Elasticsearch)常用的函数有哪些?

【电子书大全】内含上千本顶级编程书籍&#xff0c;是程序员必备的电子书资源包&#xff0c;并且会不断地更新&#xff0c;助你在编程的道路上更上一层楼&#xff01; 链接: https://pan.baidu.com/s/1yhPJ9LmS_z5TdgIgxs9NvQ?pwdyyds > 提取码: yyds Elasticsearch&#x…...

【计算机网络】ICMP报文实验

一&#xff1a;实验目的 1&#xff1a;掌握ICMP报文的各种类型及其代码。 2&#xff1a;掌握ICMP报文的格式。 3&#xff1a;深入理解TTL的含义&#xff08;Time to Live&#xff0c;生存时间&#xff09;。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS-C服务器…...

transformers进行学习率调整lr_scheduler(warmup)

一、get_scheduler实现warmup 1、warmup基本思想 Warmup&#xff08;预热&#xff09;是深度学习训练中的一种技巧&#xff0c;旨在逐步增加学习率以稳定训练过程&#xff0c;特别是在训练的早期阶段。它主要用于防止在训练初期因学习率过大导致的模型参数剧烈波动或不稳定。…...

智能优化算法之灰狼优化算法(GWO)

智能优化算法是一类基于自然界中生物、物理或社会现象的优化技术。这些算法通过模拟自然界中的一些智能行为&#xff0c;如遗传学、蚁群觅食、粒子群体运动等&#xff0c;来解决复杂的优化问题。智能优化算法广泛应用于各种工程和科学领域&#xff0c;因其具有全局搜索能力、鲁…...

昇思25天学习打卡营第17天|计算机视觉

昇思25天学习打卡营第17天 文章目录 昇思25天学习打卡营第17天ShuffleNet图像分类ShuffleNet网络介绍模型架构Pointwise Group ConvolutionChannel ShuffleShuffleNet模块构建ShuffleNet网络 模型训练和评估训练集准备与加载模型训练模型评估模型预测 打卡记录 ShuffleNet图像分…...

Windows图形界面(GUI)-MFC-C/C++ - 键鼠操作

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 MFC鼠标 派发流程 鼠标消息(客户区) 鼠标消息(非客户) 坐标处理 客户区 非客户 坐标转换 示例代码 MFC键盘 击键消息 虚拟键代码 键状态 MFC鼠标 派发流程 消息捕获&#…...

Angular 18.2.0 的新功能增强和创新

一.Angular 增强功能 Angular 是一个以支持开发强大的 Web 应用程序而闻名的平台&#xff0c;最近发布了 18.2.0 版本。此更新带来了许多新功能和改进&#xff0c;进一步增强了其功能和开发人员体验。在本文中&#xff0c;我们将深入探讨 Angular 18.2.0 为开发人员社区提供的…...

matlab 小数取余 rem 和 mod有 bug

目录 前言Matlab取余函数1 mod 函数1.1 命令行输入1.2 命令行输出 2 rem 函数2.1 命令行输入2.2 命令行输出 分析原因注意 前言 在 Matlab 代码中mod(0.11, 0.1) < 0.01 判断为真&#xff0c;mod(1.11, 0.1) < 0.01判断为假&#xff0c;导致出现意料外的结果。 结果发现…...

Avalonia中的数据模板

文章目录 1. 介绍和概述什么是数据模板:数据模板的用途:2. 定义数据模板在XAML中定义数据模板:在代码中定义数据模板:3. 使用数据模板在控件中使用数据模板:数据模板选择器:定义数据模板选择器:在XAML中使用数据模板选择器:4. 复杂数据模板使用嵌套数据模板:使用模板绑…...

Sqlmap中文使用手册 - Techniques模块参数使用

目录 1. Techniques模块的帮助文档2. 各个参数的介绍2.1 --techniqueTECH2.2 --time-secTIMESEC2.3 --union-colsUCOLS2.4 --union-charUCHAR2.5 --union-fromUFROM2.6 --dns-domainDNS2.7 --second-urlSEC2.8 --second-reqSEC 1. Techniques模块的帮助文档 Techniques:These o…...

科普文:kubernets原理

kubernetes 已经成为容器编排领域的王者&#xff0c;它是基于容器的集群编排引擎&#xff0c;具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 本文将带着大家快速了解 kubernetes &#xff0c;了解我们谈论 kubernetes 都是在谈论什么。 一、背…...

GO-学习-02-常量

常量是不变的 const package main import "fmt"func main() {//常量定义时必须赋值const pi 3.1415926const e 2.718//一次声明多个常量const(a 1b 2c "ihan")const(n1 100n2n3)//n2,n3也是100 同时声明多个常量时&#xff0c;如果省略了值则表示和…...

Vue系列面试题

大家好&#xff0c;我是有用就扩散&#xff0c;有用就点赞。 1.Vue中组件间有哪些通信方式&#xff1f; 父子组件通信&#xff1a; &#xff08;1&#xff09;props | $emit &#xff08;接收父组件数据 | 传数据给父组件&#xff09; &#xff08;2&#xff09;ref | $refs&a…...

等级保护 总结2

网络安全等级保护解决方案的主打产品&#xff1a; HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…...

关于Redis(热点数据缓存,分布式锁,缓存安全(穿透,击穿,雪崩));

热点数据缓存: 为了把一些经常访问的数据&#xff0c;放入缓存中以减少对数据库的访问频率。从而减少数据库的压力&#xff0c;提高程序的性能。【内存中存储】成为缓存; 缓存适合存放的数据: 查询频率高且修改频率低 数据安全性低 作为缓存的组件: redis组件 memory组件 e…...

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十七章 字符设备和杂项设备总结回顾

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...

C#初级——枚举

枚举 枚举是一组命名整型常量。 enum 枚举名字 { 常量1, 常量2, …… 常量n }; 枚举的常量是由 , 分隔的列表。并且&#xff0c;在这个整型常量列表中&#xff0c;通常默认第一位枚举符号的值为0&#xff0c;此后的枚举符号的值都比前一位大1。 在将枚举赋值给 int 类型的…...

Linux 动静态库

一、动静态库 1、库的理解 库其实是给我们提供方法的实现&#xff0c;如上面的对于printf函数的实现就是在库中实现的&#xff0c;而这个库也就是c标准库&#xff0c;本质也是文件&#xff0c;也有对应的路径 2、区别 静态库是指编译链接时&#xff0c;把库文件的代码全部加入…...

微信小游戏之 三消(一)

首先设定一下 单个 方块 cell 类&#xff1a; 类定义和属性 init 方法 用于初始化方块&#xff0c;接收游戏实例、数据、宽度、道具类型和位置。 onWarning 方法 设置警告精灵的帧&#xff0c;并播放闪烁动作&#xff0c;用于显示方块的警告状态。 grow 方法 根据传入的方向…...

软件测试---Linux

Linux命令使用&#xff1a;为了将来工作中与服务器设备进行交互而准备的技能&#xff08;远程连接/命令的使用&#xff09;数据库的使用&#xff1a;MySQL&#xff0c;除了查询动作需要重点掌握以外&#xff0c;其他操作了解即可什么是虚拟机 通过虚拟化技术&#xff0c;在电脑…...

数据库之数据表基本操作

目录 一、创建数据表 1.创建表的语法形式 2.使用SQL语句设置约束条件 1.设置主键约束 2.设置自增约束 3.设置非空约束 4.设置唯一性约束 5.设置无符号约束 6.设置默认约束 7.设置外键约束 8.设置表的存储引擎 二、查看表结构 1.查看表基本结构 2.查看建表语句 三…...

利用OSMnx求路网最短路径并可视化(二)

书接上回&#xff0c;为了增加多路径的可视化效果和坐标匹配最近点来实现最短路可视化&#xff0c;我们使用图形化工具matplotlib结合OSMnx的绘图功能来展示整个路网图&#xff0c;并特别高亮显示计算出的最短路径。 多起终点最短路路径并计算距离和时间 完整代码#运行环境 P…...

双向门控循环神经网络(BiGRU)及其Python和MATLAB实现

BiGRU是一种常用的深度学习模型&#xff0c;用于处理序列数据的建模和预测。它是基于GRU&#xff08;Gated Recurrent Unit&#xff09;模型的改进版本&#xff0c;通过引入更多的隐藏层和增加网络的宽度&#xff0c;能够更好地捕捉复杂的序列数据中的模式。 背景&#xff1a;…...

【BUG】已解决:ERROR: Failed building wheel for jupyter-nbextensions-configurator

ERROR: Failed building wheel for jupyter-nbextensions-configurator 目录 ERROR: Failed building wheel for jupyter-nbextensions-configurator 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我…...

Unity UGUI 之 自动布局组件

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本&#xff0c;请注意分别 1.什么是自动布局组件…...

网络基础之(11)优秀学习资料

网络基础之(11)优秀学习资料 Author&#xff1a;Once Day Date: 2024年7月27日 漫漫长路&#xff0c;有人对你笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的博客-CSDN博客。 参考文档&#xff1a; 网络工程初学者的学习方法及成长之路&#xff08;红…...

QT自定义无边框窗口(可移动控制和窗口大小调整)

QT是一个功能强大的跨平台开发框架&#xff0c;它提供了丰富的界面设计工具和组件。在界面开发中&#xff0c;QT窗口自带的标题栏无法满足我们的需求。我们就需要自定义无边框窗口&#xff0c;包括自定义标题栏和窗口大小调整功能。本文将介绍如何在QT中实现这些功能。 一、简…...

Typora 【最新1.8.6】版本安装下载教程 (轻量级 Markdown 编辑器),图文步骤详解,免费领取(软件可激活使用)

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Typora 是一款专为 Markdown 爱好者设计的文本编辑器&#xff0c;它结合了简洁的界面设计与强大的 Markdown 渲染能力&#xff0c;为用户提供了一个流畅、高效的写作环境。以下是对 Typora 更详细的介绍&#xff1a; 核心特…...

RxJava 面试题及其答案

以下是一个全面的 RxJava 面试题及其答案&#xff0c;涵盖了 RxJava 的各个方面&#xff0c;包括基本概念、操作符、线程管理、错误处理、背压处理等&#xff1a; 基本概念 1. RxJava 的基本概念和原理是什么&#xff1f; 答案&#xff1a; RxJava 是一个用于响应式编程的库…...

【Rust】所有权OwnerShip

什么是所有权 rust使用由编译器检查的一些规则构成的所有权系统来管理内存。且这不会影响程序的运行效率。 所有权规则 rust中每一个每一个值都有一个owner。在同一时刻&#xff0c;只能有一个owner。当这个owner超过范围&#xff0c;则该值会被丢弃。 String类型 为什么需…...

qt总结--翻金币案例

完成了一个小项目的在qt5.15.2环境下的运行,并使用NSIS editNSIS打包完成.有待改进之处:增加计时功能,随机且能通关功能,过关后选择下一关功能.打包后仅仅有安装包有图标 安装后应用图标并未改变 在qt .pro中有待改进对qt的基本操作和帮助文档有了基本的认识.对C制作小游戏有了…...

最清楚的 BIO、NIO、AIO 详解!

一、什么是 I/O&#xff1f; I/O 描述了计算机系统与外部设备&#xff08;磁盘&#xff09;之间通信的过程。 为了保证操作系统的稳定性和安全性&#xff0c;一个进程的地址空间划分为 用户空间&#xff08;User space&#xff09; 和 内核空间&#xff08;Kernel space &…...

八股文学习第二天| HTTP请求报文和响应报文是怎样的,有哪些常见的字段?,HTTP有哪些请求方式?,GET请求和POST请求的区别?

1、HTTP请求报文和响应报文是怎样的&#xff0c;有哪些常见的字段&#xff1f; 答&#xff1a; HTTP报文分为请求报文和响应报文。 &#xff08;1&#xff09; 请求报文 请求报文主要由请求行、请求头、空行、请求体构成。 请求行包括如下字段&#xff1a; 方法&#xff08…...

C++初阶学习第四弹——类与对象(中)

目录 一. 类的默认成员函数 二.六种默认成员函数 1、构造函数 1.1 构造函数的作用 1.2 特性 1.3 默认构造函数 2、析构函数 2.1 析构函数的作用 2.2 析构函数的用法 3、拷贝构造函数 3.1 拷贝构造函数的作用 3.2 特征 3.3 默认拷贝构造函数 三.总结 类与对象&…...

【计算机网络】期末实验答辩

注意事项&#xff1a; 1&#xff09;每位同学要在下面做过的实验列表中选取三个实验进行答辩准备&#xff0c;并将自己的姓名&#xff0c;学号以及三个实验序号填入共享文档"1&#xff08;2&#xff09;班答辩名单"中。 2&#xff09;在答辩当日每位同学由老师在表…...

一步步教你学会如何安装VMare虚拟机(流程参考图)

前言&#xff1a;一步步教你安装VMare虚拟机&#xff08;此版本为17.5。2版本&#xff09;。 1、安装 2、确认协议 3、选择位置存放 4、选择第二个 5、都不选。 6、都选提供便捷操作 7、点击许可证&#xff0c;将密钥输入&#xff08;可以在网络寻找自己版本的密钥&#xff…...

WebGoC题解(14) 151.(2017dloi小乙)第5题 巧克力甜度(sweet)

题目描述 妈妈买了n颗甜度不同的巧克力&#xff0c;规定小C只能吃最大甜度之和是S。 例如&#xff1a;有5颗巧克力&#xff0c;s6&#xff0c;每个的甜度分别为&#xff1a; 4 2 3 1 1&#xff0c;那么小C最多可以吃3颗。 请问你能帮小C计算一下最多能吃多少颗巧克力吗? 输入格…...

深入探索PHP框架:Symfony框架全面解析

1. 引言 在现代Web开发领域&#xff0c;PHP作为一种广泛使用的服务器端脚本语言&#xff0c;其框架的选择对于项目的成功至关重要。PHP框架不仅能够提高开发效率&#xff0c;还能确保代码的质量和可维护性。本文将深入探讨Symfony框架&#xff0c;这是一个功能强大且灵活的PHP…...

内卷的利与弊

“内卷”原指一类文化模式达到了某种最终的形态以后&#xff0c;既没有办法稳定下来&#xff0c;也没有办法转变为新的形态&#xff0c;而只能不断地在内部变得更加复杂的现象。经网络流传&#xff0c;很多大学生用其来指代非理性的内部竞争或“被自愿”竞争。现指同行间竞相付…...