自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 代码随想录算法训练营Day50 | LeetCode123.买卖股票的最佳时机III、LeetCode188.买卖股票的最佳时机IV

本题的关键是确定dp数组的含义,由于最多进行两次买卖,所以将dp数组分为五个状态:dp[i][0]第i天未持有;dp[i][1]第i天第一次持有;dp[i][2]第i天第一次未持有;dp[i][3]第i天第二次持有;dp[i][4]第i天第二次未持有。注意这里面持有,包含两个状态,即前一天已经持有或者该天刚刚买入。返回时返回dp[][4]即可,因为第二次卖出的情况已经包含了第一次卖出的情况,因为对于第一次卖出而言,我还可以在当天再买入再卖出,对于总利润是不变的。

2024-03-20 00:06:01 292

原创 代码随想录算法训练营Day48 | LeetCode121. 买卖股票的最佳时机、LeetCode122.买卖股票的最佳时机II

动规五部曲:1、dp[i][0]:在第i天持有股票的最大收入;dp[i][1]:在第i天不持有股票的最大收入。2、递推公式:第i天持有股票,有两种情况:前一天已经持有,当天刚买入,取最大值;第i天不持有股票,也有两种情况:前一天也未持有,当天刚卖出,取最大值。3、初始化4、遍历顺序5、打印dp数组。

2024-03-18 18:30:14 442

原创 代码随想录算法训练营Day47 | LeetCode198.打家劫舍、LeetCode213.打家劫舍II、LeetCode337.打家劫舍III

本题较为简单,考虑一个节点时,只需要考虑偷和不偷两种情况,当不偷的情况时,取dp[n-1],这里的意思并不是决定偷n-1的节点,而是考虑n-1节点时的最大价值。

2024-03-17 12:25:22 397

原创 代码随想录算法训练营Day46 | 139.单词拆分、多重背包问题、背包问题总结

物品只能使用1次,来装入背包,以使得背包中物品价值最大问题。解决此类问题可以直接用二维dp数组,这样就不会涉及遍历顺序的问题,从前往后遍历即可;为了优化空间复杂度,可以只使用一维数组,那么再遍历背包容量时,需要从后往前遍历,来确保每件物品只被用一次。

2024-03-16 21:49:38 421

原创 代码随想录算法训练营Day45 | LeetCode70. 爬楼梯 (进阶)、LeetCode322. 零钱兑换、LeetCode279.完全平方数

爬楼梯问题将每次最多爬两步改成爬m步,那么就变成一个完全背包问题,1阶,2阶...m阶为商品,楼梯总数为背包容量,问有几种方法装满背包,此为求排列问题,因此先遍历背包容量,再遍历物品,代码如下:时间复杂度O(m*n),空间复杂度O(n).

2024-03-13 09:51:08 370

原创 代码随想录算法训练营Day43 | 完全背包问题、LeetCode518. 零钱兑换 II、LeetCode377. 组合总和 Ⅳ

背包问题中,每个物品可以放无数次,求得背包可以装得物品的最大价值。在代码上的区别就是遍历背包容量时,将01背包问题的后序遍历改成前序遍历即可,过程如下:本题weight数组为[1,3,4],value数组为[15,20,40];可以想象一下,如果物品1的价值改成50,那么dp[3]的数组就会更新成50,而不是45。完全背包问题贴卡哥代码如下:在纯完全背包问题中,两个for循环的顺序可以改变,可以先遍历背包容量,再遍历物品,为了和01背包保持统一,这里就保持先遍历物品再遍历背包容量的代码逻辑。

2024-03-12 12:16:58 319

原创 代码随想录算法训练营Day42 | LeetCode1049. 最后一块石头的重量 II、LeetCode494. 目标和、LeetCode474.一和零

这道题难点在于如何转换成背包问题,其实和上一题和相等子集合基本一样,尽量把石头分成两个重量相等的集合,那么在碰撞之后和就是最小的,石头的重量也可以当作石头的价值,代码也基本一样,就是最后的返回值是返回最小的差值,除法是向下取整,所以sum-dp[target]>dp[target]。代码如下:时间复杂度O(m*n);空间复杂度O(m)。

2024-03-11 19:13:30 399

原创 代码随想录算法训练营Day41 | 背包问题 一维、背包问题 二维、LeetCode416. 分割等和子集

背包问题:用若干件物品装入固定容量的背包,使得背包内物品价值最大,我们有若干件物品体积的数组,也有物品价值的数组。01背包问题:每件物品只有一个。在解决背包问题时,明确递归五部曲:1、dp[i][j]数组含义:从[0,i]个物品放在容量为j的背包中获得的最大价值。2、递推公式:分两种情况(1)没有放物品i:dp[i][j]=dp[i-1][j];(2)放了物品i:dp[i][j]=dp[i-1][j-weight[i]]。(这个思路很难想)那么递推公式就是取其中的最大值。

2024-03-10 17:56:59 356

原创 代码随想录算法训练营Day40 | LeetCode343. 整数拆分、LeetCode96.不同的二叉搜索树

这道题如果用数学证明的方法,利用贪心的策略,将数全部拆成3,有余数×4,即可得到最大值,但需要数学证明。本题用动态规划的思想第一层for循环从小到大遍历数组,dp[i]即为第i个数拆分之后的最大值。第二层for循环,负责拆分数,j控制每次拆出来的数大小,最后取最大值。动态规划五部曲:dp数组含义;递推公式;初始化;遍历顺序;打印dp数组,本题递推公式比较难想。代码如下:时间复杂度O(n^2);空间复杂度有O(n)

2024-03-09 12:07:45 366

原创 代码随想录算法训练营Day39 | LeetCode62.不同路径、LeetCode63. 不同路径 II

动态规划五部曲:1、dp数组含义:dp[i][j]表示有几种路径到达第i行第j列的方格2、递推公式:由于只能向下或向右,因此dp[i][j]=dp[i-1][j]+dp[i][j-1]3、初始化:二维数组,第一行和第一列都需要初始化为14、遍历顺序:由递推公式得到,遍历顺序从左往右,从上到下5、打印dp数组:如果遇到错误,打印日志dp日志代码如下:时间复杂度O(m*n);空间复杂度O(m*n)。当然本题如果想优化空间复杂度,也可以直接使用一维数组来表示dp数组,这里不再额外书写。

2024-03-08 14:21:35 345

原创 代码随想录算法训练营Day38 | 动态规划理论基础、LeetCode509. 斐波那契数、LeetCode70. 爬楼梯、LeetCode746. 使用最小花费爬楼梯

动态规划是由前一个状态推导出来的,而贪心是局部选最优的。比如背包问题,贪心每次都只放最大或最小的物品,这样显然结果不会是全局最优的,这时候就需要用到动态规划的思想。

2024-03-07 15:19:29 371

原创 代码随想录算法训练营Day37 | LeetCode738.单调递增的数字、LeetCode968.监控二叉树、贪心算法总结

思路:与分糖果的题目同理,因为需要与前一位数比较,并且修改这两个数,因此需要从后往前遍历,当前一位数比当前数大时,则前一个数-1,后一个数变为9。代码细节:1、flag初始值不为0,因为当数本身就是递增序列时,不应该执行赋9操作。2、flag=i,而不是直接赋值,因为如果当数字为1000时,并不会执行赋值操作,但是最终答案为999。LeetCode968.监控二叉树贪心逻辑:如果叶子节点没有被摄像头覆盖,那么在叶子节点的父节点装摄像头。由此确定父节点的状态需要先确定其孩子的状态,因此遍历顺序为后

2024-03-05 15:08:53 417

原创 代码随想录算法训练营Day 36 | LeetCode435. 无重叠区间、LeetCode763.划分字母区间、LeetCode56. 合并区间

和上题引爆气球的逻辑非常像,只要想到左边界排序之后,更新右边界为最小值,则就可以轻松写出代码,如果按照右边界来排序,则就可以省去取最小值的逻辑。代码如下:时间复杂度O(nlogn);空间复杂度O(n)(快排)

2024-03-04 16:43:07 368

原创 代码随想录算法训练营 Day34 | LeetCode860.柠檬水找零、LeetCode406.根据身高重建队列、 LeetCode452. 用最少数量的箭引爆气球

这道题没有那么复杂的策略,就是理清楚所有的情况用代码写出来即可,记录10和5的数量。贪心的策略就是优先使用10的面值。代码如下:时间复杂度O(n);空间复杂度O(1).

2024-03-04 00:11:13 341

原创 代码随想录算法训练营Day 33 | LeetCode1005.K次取反后最大化的数组和、LeetCode134. 加油站、LeetCode135. 分发糖果

本题较为简单,一开始的思路是先从小到大排序,然后当处理完负数时,再重新从小到大排序,处理正数,或者维护一个绝对值最小的数的下标。那么其实可以直接对nums进行绝对值排序,这样就不需要排序两遍了,需要自己额外定义一个cmp函数。代码如下,时间复杂度即为排序算法时间复杂度;空间复杂度O(1).

2024-03-03 16:29:50 363

原创 代码随想录算法训练营 Day32 | LeetCode122.买卖股票的最佳时机II、LeetCode55. 跳跃游戏、LeetCode45.跳跃游戏II

那么这里面根据贪心思想:1、在最低点时买入,如果该点比上一点价格更低,只有两种情况:上一点为买入点,则此时更新买入点;上一点不是买入点,则此时将股票卖出,并更新买入点2、在最高点卖出,如果该点比上一点价格更高,则继续向后观望,直到最高的点。3、首尾处的结果,避免价格一直是单调序列,因此在结尾处再添加一个卖出的操作。

2024-03-02 16:29:57 323

原创 代码随想录算法训练营Day 31 | 贪心算法理论基础、LeetCode455.分发饼干、LeetCode376. 摆动序列、LeetCode53. 最大子序和

贪心算法:每一步取局部最优,最终可以获得全局最优。什么时候用贪心:看是否能举出反例来,举不出来可以尝试使用贪心。贪心有时候就是最常识的推导,无需数学公式或证明,很多时候不需要有为什么这么做,而是就是应该这么做的思想。应该明确每一步的局部最优的思想是怎样的,是怎样通过局部最优求解全局最优。

2024-03-02 14:54:28 368

原创 代码随想录算法训练营 Day30 | LeetCode332.重新安排行程、LeetCode51. N皇后、LeetCode37. 解数独、回溯算法总结

本题较为困难,难点在于选取怎样的容器来表示不同地点的映射关系,并且一个地点是可以反复经过的,这个逻辑怎样映射到回溯的思想中,这里面map<string,int>里的int存放的即为航班还需要航行到这里的次数。本题较难,没有太深究,贴卡哥代码如下:LeetCode51. N皇后感觉逻辑上和组合问题是一样的,对于组合问题,就是利用递归代替了层数的for循环,那么在N皇后问题中,就是用递归代替行数的for循环,这里面行数就是树的深度。判断是否合法的函数中,只需要判断可能下过棋的位置即可,包括左上、上、右

2024-03-01 16:10:47 382

原创 代码随想录算法训练营 Day29 | LeetCode491.递增子序列、LeetCode46.全排列、LeetCode47.全排列 II

该题强调与之前的题目的不同在于给的数组顺序不能变换,这就导致了不能用used数组+判断与前一个元素是否相同的方法进行去重的操作,因此该题加入了一个set,不和前一个元素比,而是判断之前有没有处理过这个值来进行去重的操作。细节:1、本题set写在回溯函数内部,也就是树每深入一层就创建一个新的set,而我们是树层去重,只要保证每一层的树使用的是同一个set即可,并且set不需要进行回溯操作。2、剪枝操作利用的是continue;因为不是排序数组,所以即时有不符合条件的数组,后面的结果也是可能符合要求的。

2024-02-29 21:51:44 361

原创 代码随想录算法训练营 Day27 | LeetCode93.复原IP地址、LeetCode78.子集、LeetCode90.子集II

本题与上题分割回文串有相同的原理,遍历都是为了确定分割线的位置本题代码细节:pointNum->递归时startIndex参数+2;判断最后一部分的特殊逻辑。

2024-02-27 11:23:20 371

原创 代码随想录算法训练营 Day26 | LeetCode39. 组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串

该题与之前的题相比涉及两个重要思路:1、去重:遍历当前元素时,重复回溯,可以再包含当前元素,但是不能再包含上一个元素,否则就会有重复,因此这里回溯参数选取的是i,而不是i+1;2、剪枝:因为数组不是有序的,如果按以前的方法剪枝,则会少掉很多结果,如果不排序,那么则需要在终止条件上加入return的逻辑,如果排序,则就可以在for循环里面剪枝。代码如下:最坏时间复杂度(n*2^n);空间复杂度O(targer)

2024-02-26 12:22:31 349

原创 代码随想录算法训练营Day25 | LeetCode216.组合总和III、LeetCode17.电话号码的字母组合

比上一题多的地方在于,需要加一个和得判别条件,以及剪枝操作时可以加一条判断和如果已经大于了目标值,则可以直接返回。

2024-02-25 14:32:00 388

原创 代码随想录算法训练营Day24 | 回溯算法理论基础、LeetCode77. 组合、剪枝操作

1、回溯法和递归法是相辅相成的,递归逻辑底层就是回溯,通常所说的回溯函数其实就是递归函数。2、回溯法的效率不高,本质就是暴力查找,在一些复杂的问题中能够有一种方法进行暴力查找就不错了,提升效率的方法就是做一些剪枝的处理。3、通常回溯可以解决的问题包括:组合、切割、子集、排列、棋盘问题。4、回溯问题都可以抽象成一个N叉树的结构,元素的个数代表了树的宽度,递归的层数代表了树的深度。5、回溯法模板。

2024-02-24 14:55:46 389

原创 代码随想录算法训练营Day23 | LeetCode669. 修剪二叉搜索树、LeetCode108.将有序数组转换为二叉搜索树、LeetCode538.把二叉搜索树转换为累加树、二叉树总结

此题其实相对于删除二叉搜索树的节点少考虑了两种情况,只不过需要遍历整个二叉搜索树,而删除节点只需要找到节点即可。终止条件:小于左区间,则节点的右孩子可能在区间内,继续对右孩子做修建并返回根节点,在单层递归逻辑中用根节点左子树接住返回值;大于右区间同理单层递归:分别对左子树和右子树做修建,最后返回根节点。代码如下:这题如果使用迭代法,需要设计三种思路:1、处理根节点思路;2、处理左子树思路;3、处理右子树思路,比较复杂,贴卡哥代码如下:LeetCode108.将有序数组转换为二叉搜索树 为了

2024-02-23 18:45:05 368

原创 代码随想录算法训练营Day22 | LeetCode235. 二叉搜索树的最近公共祖先、LeetCode701.二叉搜索树中的插入操作、LeetCode450.删除二叉搜索树中的节点

5、删除节点左右孩子都不为空:需要找左孩子或右孩子来顶替被删除节点,找谁逻辑都是类似的,这里以找右孩子为例,那么被删除节点的左孩子需要找地方放,就只能放在被删除节点右孩子的最左孩子的左孩子处(说的有点绕,可以画图就能想通)注:C++应涉及内存释放的操作,即在每一步返回前先用临时变量接住要返回的变量,在delete掉要删除的节点,再返回临时变量。以上五种情况写终止条件时,均可以返回具体的左右子树的节点,然后在上一层递归中会用根节点的左右子树来接住,思路也是很巧妙地。3、删除节点左孩子为空,右孩子不为空。

2024-02-22 23:10:12 307 1

原创 代码随想录算法训练营Day20 | LeetCode530.二叉搜索树的最小绝对差、LeetCode501.二叉搜索树中的众数、LeetCode236. 二叉树的最近公共祖先

一开始写这个代码的时候将count与maxCount的判断逻辑放到了值判断是否的相等的模块中,导致无法更新叶子节点的频率,如果要对当下cur节点进行处理,需要在每一次递归时都要判断一遍。递归逻辑:如果左子树包含p或q,右子树包含p或q,则返回当前节点,当前节点即为最近公共祖先,后面需要做的就是不停将此节点向上返回。这题虽然代码不长,但确实有难度,思路也确实很巧妙。审题:一定包含p和q,并且每个节点的val互不相同。这里面也包含了公共祖先就是p或q节点的情况。

2024-02-21 14:44:11 371

原创 代码随想录算法训练营 Day19 | LeetCode654.最大二叉树、LeetCode617.合并二叉树、LeetCode700.二叉搜索树中的搜索、LeetCode98.验证二叉搜索树

一个最直白的思路就是,先按照前序遍历二叉树,二叉搜索树的前序遍历应该是递增的,由此来验证,但此时时间空间复杂度就高,其实可以在遍历二叉树的时候就判断是否为搜索树。注:测试用例中包含了INT_MIN,所以这里要用LONG_MIN,但如果测试用例包含了LONG_MIN,这种方法就失效了。容易陷入的误区:搜索树应该是根节点的值要大于所有左子树的值,小于所有右子树的值,而不单单大于左节点,小于右节点。3、保证两棵树的遍历顺序相同,前序遍历比较简单。1、如果一个节点为空,则直接返回另一个节点。

2024-02-20 20:54:24 337

原创 代码随想录算法训练营Day18 | LeetCode513找树左下角的值、 LeetCode112/113路径总和、LeetCode105/106从中序与后序遍历序列构造二叉树

比较难的是使用递归的方法,递归的思路为找到最开始的最大深度的节点,因为不管使用什么遍历,左节点始终在右节点前面,所以最开始找到的最大深度的节点即为最后一行的最左边节点,思路还是挺巧妙的,这道题也不用处理中间节点,代码如下:递归的过程可以用traversal(node->left,depth+1)代替,这个过程就隐含了回溯的过程。

2024-02-20 19:26:29 417

原创 代码随想录算法训练营Day17 | LeetCode110.平衡二叉树、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和

递归思路,后序遍历方式,定义一个求高度的函数,如果任意一个节点的左右子树不满足平衡二叉树的条件,则直接返回-1,往上回溯时不停的返回-1,如果满足,则当前节点的最大高度为左右孩子节点的最大高度较大值+1。代码如下:本题迭代法较为繁琐,效率不高,优先考虑递归方法。

2024-02-14 13:17:06 378 1

原创 代码随想录算法训练营 Day16 | LeetCode104.二叉树的最大深度、LeetCode111.二叉树的最小深度、LeetCode222.完全二叉树的节点个数

该题用递归法可以很短的代码解决,但要理清遍历顺序,使用此种方法的顺序为后序遍历,即先确定左右子树的最大深度,再确定根节点的最大深度。

2024-02-09 19:29:41 389 1

原创 代码随想录算法训练营Day15 | LeetCode102 层序遍历、LeetCode226.翻转二叉树、LeetCode101. 对称二叉树

层序遍历使用队列来实现,处理每个节点的时候,就将它的左右孩子添加到队列中,作为下次处理的对象,其中一个细节就是,需要设置一个size变量持续维护queue的大小,以此来确定下一层需要处理几个节点(弹出几个节点)。该题还有相应的递归法:思路不太好想,放了卡哥的代码。

2024-02-08 18:23:28 337

原创 代码随想录算法训练营Day14 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代

int value;

2024-02-06 13:22:04 379 1

原创 代码随想录算法训练与Day12 | LeetCode239. 滑动窗口最大值、LeetCode347.前 K 个高频元素、栈与队列总结

本题如果想做O(n)的时间复杂度思路比较复杂,需要自己创建一个单调栈的队列。本题难点在于:1、如何将每次取最大值位置固定化,保证代码的统一性;2、若将最大值位置固定化,如何做到push和pop的更新;本题思路:1、确定在滑动窗口移除的过程中,不需要持续维护的数,因此当创建一个队列时,如果前面的元素比要添加的元素小,则就不需要维护之前的元素,都可以pop出来,这样保证了最大值元素就是队列的front值;2、在pop操作时,只需要判断当前需要pop的值与队列的front值是否相等,相等的话,则队列front

2024-02-05 16:17:00 316 1

原创 代码随想录算法训练营Day11 | LeetCode20. 有效的括号、LeetCode1047. 删除字符串中的所有相邻重复项、LeetCode150. 逆波兰表达式求值

该题其实场景不多,代码都考虑到了就可以了,有三种场景:1、左括号多了;2、括号顺序不对;3、右括号多了。经典需要用栈解决的问题,因为之前写过hashmap的题,这里再复习一下,定义了一个hashmap来映射左右括号之间的关系,这里栈存放的是左括号。时间复杂度O(n),空间复杂度O(n);

2024-02-04 16:28:50 354 1

原创 代码随想录算法训练营Day10 | 栈与队列理论基础、LeetCode232.用栈实现队列、LeetCode225. 用队列实现栈

1、基本特性:栈先进后出,队列先进先出2、不同STL版本对应其不同实现原理,以SGI STL为例,如果不指定栈的实现原理,默认是deque,当然也可以通过stack 方式指定栈的实现原理,因此通常不把栈和堆列称为容器,而称其为container adapter(容器适配器),主要实现原理就是数组和链表的底层实现。

2024-02-02 14:36:16 358

原创 代码随想录算法训练营Day9 | LeetCode28. 实现 strStr()、 LeetCode459.重复的子字符串、字符串总结、 双指针回顾

经典的KMP算法,理解起来需要费些时间,包含了回溯的思想。先求得next数组之后,当出现不相等情况时,直接跳到next数组值处的下标重新搜索,比起两层for循环大大缩短了时间复杂度,时间复杂度为O(n+m),空间复杂度为O(m)LeetCode459.重复的子字符串KMP方法:不被最长前后缀包含的必定是最小字串,判断字符串长度是否能被最小字串长度整除,若可以,则该为最小字串,整个字符串均由其构成。时间复杂度O(n),空间复杂度O(1).移动匹配方法:将两个字符串拼接,去头去尾后检查原

2024-02-01 22:21:54 364 1

原创 代码随想录算法训练营Day8 | LeetCode344.反转字符串、 541. 反转字符串II、151.翻转字符串里的单词、 卡码网:54.替换数字、55.右旋转字符串

使用双指针比较容易解决,学到一种使用位运算交换数值的方法;

2024-01-31 16:20:04 354 1

原创 代码随想录算法训练营Day7 | LeetCode454.四数相加II、LeetCode383. 赎金信 、LeetCode15. 三数之和、LeetCode18. 四数之和

和两数相加的思想类似,但这里是四数相加,综合考虑时间复杂度,将4个数拆分成两份,先分别利用两个for循环进行两两相加,再利用hashmap实现,时间复杂度为O(n^2);空间复杂度: O(n^2),最坏情况下A和B的值各不相同,相加产生的数字个数为 n^2。注意这里这样写是因为答案不用去重,就是求取有顺序的排列组合问题。

2024-01-31 14:28:28 327 1

原创 代码随想录算法训练营Day6 | 哈希表理论基础、LeetCode242有效的字母异位词、LeetCode349两个数组的交集、LeetCode202快乐数、LeetCode1两数之和

1、重要的事情放在开头,当看到需要在一个元素集合中查询是否存在某一个元素时,就应想到使用哈希法。2、常见的哈希结构包括数组,set,map,数据本质上就是一个哈希表,哈希表就是利用关键码来访问数据,数组即是利用索引直接访问到数据值。3、将不同数据类型的数据转换成关键码就用到了哈希函数,那么如果数据大小大于哈希表大小,导致存放数据间发生冲突,即哈希碰撞,应该怎么办呢,这时候考虑用拉链法,即在碰撞的位置存放一张链表来存放发生碰撞的数据;

2024-01-29 15:07:29 364

原创 代码随想录算法训练营Day4 | LeetCode24 两两交换链表中的节点 、LeetCode19删除链表的倒数第N个节点 、面试题 02.07. 链表相交、LeetCode142环形链表II

类似题目最好画一下图,就清晰很多,不然容易绕进去。需要注意几点:1、循环终止条件:分节点数奇偶情况讨论,如果为奇数,则cur->next=nullptr,一定要先判断,因为偶数时需要判断cur->next->next==nullptr2、修改一个节点的next后,画图中之前的指向就无法获取,需要使用临时节点保存3、返回值不能返回head,此时head已经被交换,需要返回dummyHead->next。

2024-01-27 15:46:56 362

空空如也

空空如也

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

TA关注的人

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