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

数据结构 之 链表LinkedList

目录

1. ArrayList的缺陷:

2. 链表:

2.1 链表的概念及结构:

 3. 链表的使用和模拟实现:

3.1 构造方法:

3.2 模拟实现:

4. 源码分享:


在我学习顺序表之后,我就立马开始了链表的学习,但是在学习链表之前,我就有一个疑问,为什么明明有了顺序表这一种数据结构为什么我们还要有链表这一种数据结构呢?

1. ArrayList的缺陷:

通过对ArrayList的简单了解,我们知道,其实顺序表的底层是由数组来实现的,他是一段连续的空间,所以,当ArrayList在增删元素的时候,通过计算我们发现,他的时间复杂度为O(n),效率比较低下,如果数据很大的情况下,使用顺序表进行增删操作,会浪费非常多的时间,所以,就引入了链表这一种数据结构!!!

2. 链表:

2.1 链表的概念及结构:

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

在现实生活中,火车的结构就类似于我们的链表

链表的结构多种多样:

1. 单向或者双向:

2. 带头或者不带头:

3.循环或者不循环:

以上就是链表的结构,所以一共有八种链表:

单向不带头不循环链表;

单向带头不循环链表;

单向不带头循环链表;

单向带头循环链表;

双向不带头不循环链表;

双向带头不循环链表;

双向不带头循环链表;

双向带头循环链表;

 3. 链表的使用和模拟实现:

3.1 构造方法:

链表源码提供了两个构造方法:

这是不带参数的构造方法;

这是带一个参数的构造方法,将c中的全部元素都拷贝到链表中;

3.2 模拟实现:

首先,我们需要创建一个My_LinkedList类:(我们以单向不带头不循环链表为例)

在这个类中创建一个静态内部类,称为ListNode,一共有两个成员,一个是value用来存放该节点的值的,一个是next,用来存放下一个节点的地址,同时我们还可以写一个构造方法;

再实例化一个头节点

public class My_LinkedList {static class ListNode {public int val;//数值域public ListNode next;//存储下一个节点的地址public ListNode(int val) {this.val = val;}}public ListNode head = new ListNode(0);   //实例化头节点public My_LinkedList(int val) {head.val = val;                       //构造方法}
}

< 1 > addFirst方法:

头插法,在链表的第一个节点插入新的节点:

假如我们在如图所示的链表中头插一个node节点

为了防止我们的首节点丢失,我们需要先将首节点的地址传给新的节点,再将新节点更新为head

/*** 头插法* addFrist*/public void addFirst(int data) {ListNode node = new ListNode(data);     //实例化一个节点node/*if(this.head == null) {this.head = node;}else {node.next = this.head;this.head = node;}*/node.next = this.head;              //将首节点的地址赋给新的节点this.head = node;                   //将新的节点更新为head}

< 2 > addLast方法:

尾插法,将新节点插入链表末端:

public void addLast(int data) {ListNode node = new ListNode(data);     //实例化一个node节点if (head == null) {head = node;                        //若链表为空,则直接将node更新为head} else {ListNode cur = head;                //实例化一个cur节点while (cur.next != null) {          //用cur节点去遍历链表,知道cur节点为最后一个节点cur = cur.next;                 }//cur.next == null;cur.next = node;                    //将node赋值给cur.next,也就是将node节点放在了链表的最末端}}

< 3 > size方法:

得到并返回单链表的长度:

//得到单链表的长度public int size() {int count = 0;              //创建整形变量count作为计数器ListNode cur = this.head;   //实例化cur = 当前的头节点while (cur != null) {       //遍历整个链表count++;                //每遍历一个节点,则count++cur = cur.next;         //cur一直向后移动}return count;               //返回单链表的长度}

< 4 > add方法:

任意位置插入,将节点插入指定位置:

在插入之前,我先要检测给定的节点位置是否合理:

private void checkIndexAdd(int index) {if (index < 0 || index > size()) {          //如果位置不合理throw new MySingleListIndexOutOfException("任意位置插入的时候,index不合法!");}           //若不合理,则抛出异常}
MySingleListIndexOutOfException :
public class MySingleListIndexOutOfException extends RuntimeException{public MySingleListIndexOutOfException() {super();}public MySingleListIndexOutOfException(String str) {super(str);}
}
public void add(int index, int data) throws MySingleListIndexOutOfException {checkIndexAdd(index);                   //检查index位置是否合法if (index == 0) {                       //如果index为0addFirst(data);                     //进行头插法return;}if (index == size()) {                  //如果index = 单链表长度addLast(data);                      //进行尾插法return;}ListNode node = new ListNode(data);     //实例化一个node节点,值为dataListNode cur = findIndexSubOne(index);  //找到index下标的前一个节点node.next = cur.next;                   //为了防止节点丢失,先将要插入节点的next更新为前一个节点的原来的下一个节点的地址cur.next = node;                        //将cur的next更新为新的节点的地址}
private ListNode findIndexSubOne(int index) {ListNode cur = this.head;           //实例化一个cur = 头节点while (index - 1 != 0) {            //向后遍历index - 1次,找到index下标节点的前一个节点cur = cur.next;index--;}return cur;                         //返回当前节点 }

< 5 > contains方法:

查找是否包含关键子key在链表当中:

//查找是否包含关键字key是否在单链表当中public boolean contains(int key) {if (head == null) {                 //如果head为空,则直接返回falsereturn false;}ListNode cur = this.head;           //实例化一个cur节点 = 头节点//cur != null 说明 没有遍历完 链表while (cur != null) {               //cur不停向后遍历if (cur.val == key) {           //找到了keyreturn true;                //返回true}cur = cur.next;}return false;                       //循环结束,cur.next = null,说明没有找到key,返回false}

< 6 > remove方法:

删除第一次出现的值为key的节点:

//删除第一次出现关键字为key的节点public void remove(int key) {if (this.head == null) {                            //如果链表为空,则没有元素,无法删除System.out.println("此时链表为空,不能进行删除!");return;}if (this.head.val == key) {//判断 第一个节点是不是等于我要删除的节点this.head = this.head.next;return;}ListNode cur = this.head;           //实例化一个cur = headwhile (cur.next != null) {          //遍历整个链表,直到cur为最后一个节点为止if (cur.next.val == key) {      //如果找到了值为key的节点//进行删除了ListNode del = cur.next;    //实例化del节点为cur节点的下一个节点cur.next = del.next;        //将前一个节点的next更新为后一个节点的地址return;}cur = cur.next;}System.out.println("未找到值为key的节点");      //跳出循环,说明没有值为key的节点}

< 7 > removeAll方法:

//删除所有值为key的节点public void removeAllKey(int key) {if (this.head == null) {                    //如果head == null,则链表为空,不能进行删除操作return;}//单独处理了头节点,若头节点的值为key,则头节点向后移动if(this.head.val == key) {head = head.next;}ListNode cur = this.head.next;              //实例化cur节点 == head节点的下一个节点ListNode prev = this.head;                  //实例化prev节点 == head节点while (cur != null) {                       //cur节点不断向后遍历if (cur.val == key) {                   //如果cur.val == key即找到了值为key的节点prev.next = cur.next;               //将prev节点即cur的前一个节点的next = cur.next, 即删除了cur位置的节点cur = cur.next;                     //cur继续向后走,查找值为key的节点} else {                                //若cur.val != keyprev = cur;                         //prev和cur一起向后移动                cur = cur.next;}}}

< 8 > clear方法:

clear方法的实现有两种方法:

第一种:

public void clear() {this.head = null;}

这种做法比较粗暴,直接将head置为空,由于之前的链表中的节点没有了引用,故会被系统给自动回收;

第二种:

/*** 当我们 执行clear这个函数的时候,会将这个链表当中的所有的节点回收*/public void clear() {ListNode cur = this.head;           //令cur = headListNode curNext = null;            //实例化一个curNextwhile (cur != null) {               curNext = cur.next;             //将curNext更新为cur.nextcur.next = null;                //再将cur节点的next置为空cur = curNext;                  //再将cur更新为curNext,一个一个的去删除链表中的所有的节点}head = null;                        //最后将head置为空即可}

4. 源码分享:

在我的模拟实现源码中,我多写了createList方法和display方法,即创建链表和打印链表方法,为的是模拟实现后方便进行测试,以找出代码的不足!!!

public class My_LinkedList {static class ListNode {public int val;//数值域public ListNode next;//存储下一个节点的地址public ListNode(int val) {this.val = val;}}public ListNode head;//代表单链表的头结点的引用/*** 这里只是简单的进行,链表的构造。*/public void createList() {ListNode listNode1 = new ListNode(12);ListNode listNode2 = new ListNode(23);ListNode listNode3 = new ListNode(34);ListNode listNode4 = new ListNode(45);ListNode listNode5 = new ListNode(56);listNode1.next = listNode2;listNode2.next = listNode3;listNode3.next = listNode4;listNode4.next = listNode5;this.head = listNode1;}public void display() {ListNode cur = head;while (cur != null) {System.out.print(cur.val + " ");cur = cur.next;}System.out.println();}/*** 从指定的节点开始答应** @param newHead*/public void display(ListNode newHead) {ListNode cur = newHead;while (cur != null) {System.out.print(cur.val + " ");cur = cur.next;}System.out.println();}/*** 头插法* addFrist*/public void addFirst(int data) {ListNode node = new ListNode(data);     //实例化一个节点node/*if(this.head == null) {this.head = node;}else {node.next = this.head;this.head = node;}*/node.next = this.head;              //将首节点的地址赋给新的节点this.head = node;                   //将新的节点更新为head}//尾插法 O(n)public void addLast(int data) {ListNode node = new ListNode(data);     //实例化一个node节点if (head == null) {head = node;                        //若链表为空,则直接将node更新为head} else {ListNode cur = head;                //实例化一个cur节点while (cur.next != null) {          //用cur节点去遍历链表,知道cur节点为最后一个节点cur = cur.next;}//cur.next == null;cur.next = node;                    //将node赋值给cur.next,也就是将node节点放在了链表的最末端}}public void add(int index, int data) throws MySingleListIndexOutOfException {checkIndexAdd(index);                   //检查index位置是否合法if (index == 0) {                       //如果index为0addFirst(data);                     //进行头插法return;}if (index == size()) {                  //如果index = 单链表长度addLast(data);                      //进行尾插法return;}ListNode node = new ListNode(data);     //实例化一个node节点,值为dataListNode cur = findIndexSubOne(index);  //找到index下标的前一个节点node.next = cur.next;                   //为了防止节点丢失,先将要插入节点的next更新为前一个节点的原来的下一个节点的地址cur.next = node;                        //将cur的next更新为新的节点的地址}/*** 找到index-1位置的节点** @param index* @return 该节点的地址*/private ListNode findIndexSubOne(int index) {ListNode cur = this.head;           //实例化一个cur = 头节点while (index - 1 != 0) {            //向后遍历index - 1次,找到index下标节点的前一个节点cur = cur.next;index--;}return cur;                         //返回当前节点}private void checkIndexAdd(int index) {if (index < 0 || index > size()) {          //如果位置不合理throw new MySingleListIndexOutOfException("任意位置插入的时候,index不合法!");}           //若不合理,则抛出异常}//查找是否包含关键字key是否在单链表当中public boolean contains(int key) {if (head == null) {                 //如果head为空,则直接返回falsereturn false;}ListNode cur = this.head;           //实例化一个cur节点 = 头节点//cur != null 说明 没有遍历完 链表while (cur != null) {               //cur不停向后遍历if (cur.val == key) {           //找到了keyreturn true;                //返回true}cur = cur.next;}return false;                       //循环结束,cur.next = null,说明没有找到key,返回false}//删除第一次出现关键字为key的节点public void remove(int key) {if (this.head == null) {                            //如果链表为空,则没有元素,无法删除System.out.println("此时链表为空,不能进行删除!");return;}if (this.head.val == key) {//判断 第一个节点是不是等于我要删除的节点this.head = this.head.next;return;}ListNode cur = this.head;           //实例化一个cur = headwhile (cur.next != null) {          //遍历整个链表,直到cur为最后一个节点为止if (cur.next.val == key) {      //如果找到了值为key的节点//进行删除了ListNode del = cur.next;    //实例化del节点为cur节点的下一个节点cur.next = del.next;        //将前一个节点的next更新为后一个节点的地址return;}cur = cur.next;}System.out.println("未找到值为key的节点");      //跳出循环,说明没有值为key的节点}//删除所有值为key的节点public void removeAllKey(int key) {if (this.head == null) {                    //如果head == null,则链表为空,不能进行删除操作return;}//单独处理了头节点,若头节点的值为key,则头节点向后移动if(this.head.val == key) {head = head.next;}ListNode cur = this.head.next;              //实例化cur节点 == head节点的下一个节点ListNode prev = this.head;                  //实例化prev节点 == head节点while (cur != null) {                       //cur节点不断向后遍历if (cur.val == key) {                   //如果cur.val == key即找到了值为key的节点prev.next = cur.next;               //将prev节点即cur的前一个节点的next = cur.next, 即删除了cur位置的节点cur = cur.next;                     //cur继续向后走,查找值为key的节点} else {                                //若cur.val != keyprev = cur;                         //prev和cur一起向后移动cur = cur.next;}}}//得到单链表的长度public int size() {int count = 0;              //创建整形变量count作为计数器ListNode cur = this.head;   //实例化cur = 当前的头节点while (cur != null) {       //遍历整个链表count++;                //每遍历一个节点,则count++cur = cur.next;         //cur一直向后移动}return count;               //返回单链表的长度}/*** 当我们 执行clear这个函数的时候,会将这个链表当中的所有的节点回收*/public void clear() {//this.head = null;//这种做法 比较粗暴!ListNode cur = this.head;           //令cur = headListNode curNext = null;            //实例化一个curNextwhile (cur != null) {curNext = cur.next;             //将curNext更新为cur.nextcur.next = null;                //再将cur节点的next置为空cur = curNext;                  //再将cur更新为curNext,一个一个的去删除链表中的所有的节点}head = null;                        //最后将head置为空即可}
}

以上就是链表的所有的内容了,感谢大家的观看!!!

制作不易,三连支持

谢谢!!!

以上的模拟实现代码未必是最优解,仅代表本人的思路,望多多理解,谢谢!!

最后送给大家一句话,同时也是对我自己的勉励:

在心里种花,人生才不会荒芜!!!!

相关文章:

数据结构 之 链表LinkedList

目录 1. ArrayList的缺陷&#xff1a; 2. 链表&#xff1a; 2.1 链表的概念及结构&#xff1a; 3. 链表的使用和模拟实现&#xff1a; 3.1 构造方法&#xff1a; 3.2 模拟实现&#xff1a; 4. 源码分享&#xff1a; 在我学习顺序表之后&#xff0c;我就立马开始了链表的学…...

事务【MySQL】

事务的概念 引入 在 A 转账 100 元给 B 的过程中&#xff0c;如果在 A 的账户已经减去了 100 元&#xff0c;B 的账户还未加上 100 元之前断网&#xff0c;那么这 100 元将会凭空消失。对于转账这件事&#xff0c;转出和转入这两件事应该是绑定在一起的&#xff0c;任意一个动…...

Anaconda 的一些配置

Anaconda 安装及修改环境默认位置 https://blog.csdn.net/qq_54562136/article/details/128932352 最重要的一步&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;改文件夹权限 Anaconda创建、激活、退出、删除虚拟环境 修改pip install 默认安装路径...

利用Nginx正向代理实现局域网电脑访问外网

引言 在网络环境中&#xff0c;有时候我们需要让局域网内的电脑访问外网&#xff0c;但是由于网络策略或其他原因&#xff0c;直接访问外网是不可行的。这时候&#xff0c;可以借助 Nginx 来搭建一个正向代理服务器&#xff0c;实现局域网内电脑通过 Nginx 转发访问外网的需求…...

SpringMVC03、HelloSpring

3、HelloSpring 3.1、配置版 新建一个Moudle &#xff0c; springmvc-02-hello &#xff0c; 添加web的支持&#xff01; 确定导入了SpringMVC 的依赖&#xff01; 配置web.xml &#xff0c; 注册DispatcherServlet <?xml version"1.0" encoding"UTF-8…...

IOS面试题object-c 1-10

1、简述Object-C的理解与特性&#xff1f; OC 作为一门 面向对象 的语言&#xff0c;自然具有面向对象的语言特性&#xff1a;封装、继承、多态。 它既具有 静态语言的特性&#xff08;如C&#xff09;&#xff0c;又有 动态语言的效率&#xff08;动态绑定、动态加载等&#…...

原生JavaScript,根据后端返回扁平JSON动态【动态列头、动态数据】生成表格数据

前期准备&#xff1a; JQ下载地址&#xff1a; https://jquery.com/ <!DOCTYPE html> <html><head><meta charset"utf-8"><title>JSON动态生成表格数据,动态列头拼接</title><style>table {width: 800px;text-align: cen…...

hadoop报错:HADOOP_HOME and hadoop.home.dir are unset. 解决方法

参考&#xff1a;https://blog.csdn.net/weixin_45735242/article/details/120579387 解决方法 1.下载apache-hadoop-3.1.0-winutils-master 官网下载地址&#xff1a; https://github.com/s911415/apache-hadoop-3.1.0-winutils win配置系统环境&#xff1a; 然后重启idea…...

基于Springboot的高校物品捐赠管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校物品捐赠管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…...

【硬件工程师面经整理29_FPGA】

文章目录 1 nand nor的区别&#xff0c;速度差异的原因&#xff1f;2 nand驱动方式&#xff1f;3 异步信号处理方法4 异步FIFO的深度是如何计算的5 异步复位同步释放的优缺点6 问了FPGA的内部组成&#xff1f;7 LE中查找表的实现原理&#xff1f;8 IOB的主要组成部分&#xff1…...

Ping工作原理

文章目录 目的ping网络协议 OSIICMP什么是ICMP作用功能报文类型查询报文类型差错报文类型ICMP 在 IPv4 和 IPv6 的封装ICMP 在 IPv4 协议中的封装ICMP 在 IPv6 协议中的封装ICMP 头部日常ping 排除步骤ping 查询报文使用code扩展目的 本文主要是梳理ping的工作原理- 揭开 ICMP…...

python调用jar中java方法 静态类为例

java package test;public class test {// run方法返回当前脚本路径public static String runV1(String s) {return "log: " System.getProperty(s);}}python import jpype from jpype import * import osif __name__ "__main__":print(os.environ[JAV…...

tcp服务器客户端通信(socket编程)

目录 1.编程流程 2.代码演示 2.1 服务器代码 2.2 客户端代码 3.注意 3.1 ping命令 3.2 netstat命令 3.3 为什么memset? 3.4 哪个会阻塞? 3.5 显示连接信息 1.概念 1.1 编程流程 1.2 connect与listen connect方法执行后&#xff0c;会进行三次握手&#xff0c;建立连…...

chatgpt 镜像站汇总

无需登录直接可用的&#xff1a; ChatGPT Web - GPT-3.5-16k免费使用&#xff0c;吐字块&#xff0c;每日20次数&#xff0c;不需要登陆思研AI - 免费时限制每小时6次提问https://chatgpt.nicelinks.site/ - 免费使用频次有限制抱歉&#xff0c;站点已暂停 - 免费由开发者提供A…...

java面试题:为什么 SQL 语句不要过多的 join?

1 考察点 面试官主要想了解面试者对于 SQL 优化的理解以及在实际工作中如何处理 SQL 语句的性能问题。要回答好这个问题&#xff0c;只需要了解 join 操作会带来哪些影响&#xff0c;而这些影响对程序产生什么样的影响就行了。这个问题就是面试官想考察我们是不是平日里善于积…...

JAVA实战开源项目:学生日常行为评分管理系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2.1 登录注册模块2.2.2 用户管理模块2.2.3 评分项目模块2.2.4 评分数据模块2.2.5 数据字典模块 2.3 可行性设计2.4 用例设计2.5 数据库设计2.5.1 整体 E-R 图2.5.2 用户2.5.3 评分项目2.5.4 评分数据2.5.…...

力扣-[700. 二叉搜索树中的搜索]

递归法 确定递归函数的参数和返回值 递归函数的参数传入的就是根节点和要搜索的数值&#xff0c;返回的就是以这个搜索数值所在的节点。 代码如下&#xff1a; public TreeNode searchBST(TreeNode root, int val) 确定终止条件 如果root为空&#xff0c;返回null&#xff0c…...

Hive-源码分析一条hql的执行过程

一、源码下载 下面是hive官方源码下载地址&#xff0c;我下载的是hive-3.1.3&#xff0c;那就一起来看下吧 https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-src.tar.gz 二、上下文 <Hive-源码带你看hive命令背后都做了什么>博客中已经讲到了hive命令执行…...

软考71-上午题-【面向对象技术2-UML】-UML中的图2

一、用例图 上午题&#xff0c;考的少&#xff1b;下午题&#xff0c;考的多。 1-1、用例图的定义 用例图展现了一组用例、参与者以及它们之间的关系。 用例图用于对系统的静态用例图进行建模。 可以用下列两种方式来使用用例图&#xff1a; 1、对系统的语境建模&#xff1b…...

使用hashmap优化时间复杂度,leetcode1577

1577. 数的平方等于两数乘积的方法数 已解答 中等 相关标签 相关企业 提示 给你两个整数数组 nums1 和 nums2 &#xff0c;请你返回根据以下规则形成的三元组的数目&#xff08;类型 1 和类型 2 &#xff09;&#xff1a; 类型 1&#xff1a;三元组 (i, j, k) &#xff…...

猫抓Cat-Catch浏览器扩展:终极网页资源嗅探与下载完全指南

猫抓Cat-Catch浏览器扩展&#xff1a;终极网页资源嗅探与下载完全指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾为无法保存网页中的…...

DeepSeek-OCR效果展示:模糊倾斜图片也能准确识别,实测案例分享

DeepSeek-OCR效果展示&#xff1a;模糊倾斜图片也能准确识别&#xff0c;实测案例分享 1. 引言 1.1 为什么OCR识别这么难&#xff1f; 你有没有遇到过这样的场景&#xff1f;拍了一张发票照片想报销&#xff0c;结果财务说识别不出来&#xff1b;扫描了一份旧文件&#xff0…...

NumPy 矩阵核心操作入门

乘法、加法、转置与广播机制入门解析 前言 NumPy 是 Python 生态中数值计算的基石库&#xff0c;而矩阵&#xff08;数组&#xff09;操作是线性代数、数据分析、机器学习等领域的核心基础。本文将系统梳理 NumPy 中最常用的矩阵操作&#xff0c;包含矩阵乘法、矩阵加法、转置矩…...

2001-2023年各省农产品进出口额数据(无缺失)

2001-2023年各省农产品进出口额数据 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;商务BU、农业年鉴、海关总署 3、指标&#xff1a;年份、省份、农产品出口额&#xff08;亿元&#xff09;、农产品进口额&#xff08;亿元&#xff09;、农产品出口额&#xff08;万美…...

光储微网ODM/OEM标杆实践:爱阳储能的技术深耕与全场景赋能之路

在双碳目标推动下&#xff0c;全球储能产业进入规模化爆发期&#xff0c;分布式储能作为能源结构转型的核心支撑&#xff0c;正迎来前所未有的发展机遇。其中&#xff0c;ODM/OEM模式凭借柔性定制、技术适配、成本优化的核心优势&#xff0c;成为连接储能技术研发与全球市场需求…...

常见的服务器

常见的服务器 目录 [ 一、塔式服务器&#xff08;Tower Server&#xff09;](#%E4%B8%80%E3%80%81%E5%A1%94%E5%BC%8F%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88Tower%20Server%EF%BC%89) [ 二、机架式服务器&#xff08;Rack Server&#xff09;](#%E4%BA%8C%E3%80%81%E6%9C%BA%E6…...

OpenClaw错误处理机制:千问3.5-35B-A3B-FP8任务失败排查

OpenClaw错误处理机制&#xff1a;千问3.5-35B-A3B-FP8任务失败排查 1. 为什么需要关注错误处理机制 上周我在本地部署了千问3.5-35B-A3B-FP8模型&#xff0c;准备用OpenClaw实现一个自动化内容处理流程。本以为配置好模型地址就能顺利运行&#xff0c;结果第一个任务就卡在了…...

Seeed-PCA9685 Arduino库详解:16路PWM伺服与LED控制

1. 项目概述Seeed-PCA9685 是一款面向 Arduino 平台的开源驱动库&#xff0c;专为基于 NXP PCA9685 芯片的 16 通道 PWM 控制模块设计。该库直接封装了 PCA9685 的 IC 协议层与寄存器操作逻辑&#xff0c;屏蔽底层时序细节&#xff0c;使开发者能够以高级语义&#xff08;如set…...

【TypeScript 教程大纲】

TypeScript 教程大纲1. 简介TypeScript 的定义和背景TypeScript 与 JavaScript 的关系TypeScript 的优势和应用场景2. 环境搭建安装 Node.js 和 npm全局安装 TypeScript初始化一个 TypeScript 项目配置 tsconfig.json 文件3. 基础语法变量声明与类型注解基本数据类型&#xff0…...

三三学习_一些你不知道的事

特征 去中心化Decentralization 核心原則 信息分散存储&#xff0c;数据不再受科技巨企控制降低审查风险、拒绝服务&#xff08;DoS&#xff09;攻击的有效性保护个人用户的隐私数据甚至保留所有权 去信任化及无权限化Trustless and Permissionless 哎、上面刚说所有权&am…...