自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 刷题记录(LeetCode 15. 三数之和)

不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。唯一可能的三元组和为 0。,判断是否存在三元组。关键词:排序、双指针。

2025-04-28 18:10:06 140

原创 刷题记录(LeetCode 994.腐烂的橘子)

思路:典型的广度优先搜索题目,每个橘子腐烂的时间即被扩展时的层数,初始时将所有腐烂的橘子压入栈中,之后广度优先搜索,逐层扩展,扩展时将好橘子(1)更新为烂橘子(2),同时记录扩展层数(开辟dist[ ][ ]数组)。扩展完毕后,再次遍历,寻找最大的dist[i][j]即可,如果发现还有好橘子,则返回-1。左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0。

2025-03-27 23:05:51 661

原创 刷题记录(无重复字符的最长子串)

思路:设置两个指针i和j,i遍历字符串中的每个字符,j记录从i开始向左能够达到的最远处(满足不重复子串的要求)。另开辟一个哈希数组map,其下标代表ASCII码值,值代表该字符在区间[j, i]上出现的次数。i每次指向一个新的字符时,首先将s[i]代表的字符加入区间(即map[s[i]]++),之后检查map[s[i]]是否大于1,如果是,将j右移,直到map[s[i]] == 1。,请你找出其中不含有重复字符的。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。

2025-03-18 20:39:28 194

原创 快速排序模板

【代码】快速排序模板。

2025-03-13 10:57:53 139

原创 刷题记录(LeetCode 79 单词搜索)

思路:从一个点开始深度优先地搜索它附近的位置(上下左右),如果某个方向上的字符符合当前word中对应的字符,就继续从该点开始探索。如果四个方向都没有对应的字符,返回上一个字符,探索下一个方向。思路比较好想,难点在于条件控制。探索的时候需要防止数组下标越界,还要注意避免重复搜索的情况。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。关键词:回溯、深度优先搜索。

2025-03-11 16:45:53 299

原创 刷题记录(LeetCode 78 子集)

思路:感觉比全排列还简单,只要一直往数组里加数字就行了,然后每次递归调用dfs的时候都插进去,只要保证for循环从上一次递归的下一个位置开始遍历就可以了。返回该数组所有可能的子集(幂集)。

2025-03-10 17:22:34 219

原创 刷题记录(LeetCode 46 全排列)

思路:经典的回溯题,套回溯的板子就行了,需要注意的是不能重复使用同一个数字,为此开了一个used数组用来标识哪些数字被用过了。给定一个不含重复数字的数组。

2025-03-10 17:05:51 201

原创 刷题记录(LeetCode 39 组合总和)

也是典型的回溯板子,需要注意的是可能会出现重复的候选,例如[2, 2, 3]和[2, 3, 2]。为此,在回溯的时候附加一个start变量,用来标识本次从哪个数开始选,这样可以保证不重复选到之前选过的数字。2 和 3 可以形成一组候选,2 + 2 + 3 = 7。注意 2 可以使用多次。如果至少一个数字的被选数量不同,则两种组合是不同的。思路:纯自己手搓出来的,时间复杂度超过100%。7 也是一个候选, 7 = 7。,并以列表形式返回。中可以使数字和为目标数。对于给定的输入,保证和为。

2025-03-09 10:38:10 256

原创 刷题记录(LeetCode 17 电话号码的字母组合)

思路:回溯算法常用来寻找所有可能的排列情况,这道题是一道很典型的回溯题。从digits的第一个元素开始,递归地向后寻找可能的组合。由于本体多了一步转换,即一个数字对应多个字母,所以加入循环。当到达最后一个位置时,获得一种可能的排列,将其插入答案数组。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。的字符串,返回所有它能表示的字母组合。

2025-03-09 09:45:29 205

原创 刷题记录(LeetCode860 柠檬水找零)

需要用到贪心的地方在于,当顾客给20美元的时候,如果手上有10美元,那么优先用10美元找零。因为10美元只能用来找20美元,但是5美元既可以用来找20美元,也可以用来找10美元,因此手上的5美元越多越好。对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。

2025-03-08 10:34:07 330

原创 刷题记录(LeetCode738 单调递增的数字)

思路:为了方便比较,先把原数各位置上的数分解成单个数字存储在数组中。从低位向高位遍历,如果当前位(低位)的数字小于前一位(高位)的数字,将当前位的数字改成9,。需要注意的是,既然这一位改成9了,那么为了保证单调递增的特性,当前位之前(更低位)的所有位置的数字也要全部改成9。如此遍历完一遍后,得到的数组就是最终结果的各位数字。之后再把每位数字取出来变成最终结果就行了。需要注意的是,n=0需要单独处理。另外类型开long,不然会溢出。当且仅当每个相邻位数上的数字。的最大数字,且数字呈。时,我们称这个整数是。

2025-03-08 10:11:36 269

原创 刷题记录(LeetCode605 种花问题)

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。思路:简单题,直接遍历一遍,每个位置检查一下能不能种,能种就种,记录能种的位置数,最后做个判断就行了。,能否在不打破种植规则的情况下种入。

2025-03-08 09:30:05 205

原创 刷题记录(LeetCode455 分发饼干)

思路:不难想到,大的饼干应该优先满足胃口大的孩子。所以将g数组和s数组均按照从大到小排序,如果当前饼干能够满足当前的孩子,则继续拿出下一个饼干并尝试分配给下一个孩子;假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3。你有两个孩子和三块小饼干,2 个孩子的胃口值分别是 1,2。

2025-03-07 11:04:52 183

原创 刷题记录(LeetCode452 用最少数量的箭引爆气球)

而一支箭要穿过n个气球,那么这n个区间必须有共同的重叠部分(即任意两个区间都在这一子区间上重叠)。因为排好序后,当前区间的左边界一定小于上一个区间的左边界,从而保证了这个左边界就是当前最大的左边界,只要当前区间的左边界小于等于right,那么这个区间和前面的区间一定有重叠子区域(可以画图验证)。如果左边界大于right,说明这个区间不能保证和之前的每个区间都重叠,则需要增加一支箭,同时更新right为当前区间的右边界。- 在x = 2处发射箭,击破气球[1,2]和[2,3]。你不知道气球的确切 y 坐标。

2025-03-07 10:46:27 794

原创 刷题记录(LeetCode435 无重叠区间)

思路:首先来思考一下,哪个区间可以作为首区间。首区间应该满足这样的性质:不存在另外的一个区间,它的右边界小于等于首区间的左边界。为了满足以上性质,可以将原本的区间集合按照右边界进行从小到大排序,这样排序后的第一个区间一定是首区间。然后我们将原问题转化为“寻找在首区间右侧的第一个区间”,只要满足左边界大于等于首区间的右边界即可。你不需要移除任何区间,因为它们已经是无重叠的了。需要移除区间的最小数量,使剩余区间互不重叠。移除 [1,3] 后,剩下的区间没有重叠。只在一点上接触的区间是。关键词:区间排序、贪心。

2025-03-07 09:58:48 369

原创 刷题记录(LeetCode409 最长回文串)

思路:其实只要统计出每个字符出现的次数,这道题就迎刃而解了。极端情况下,如果字符的出现次数都是偶数次,那么回文串长度也是偶数;如果至少有一个字符出现次数为奇数,该字符就可以构成回文串中间的字符。每个字符对应的位置下标是该字符的ASCII码值 - ‘A’的ASCII码值。需要注意的是,最后一个大写字母‘Z’和第一个小写字母‘a’之间差了6,所以开的哈希表长度应该为52+6=58。我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。可以构造的最长回文串是"a",它的长度是 1。

2025-03-05 20:27:48 269

原创 刷题记录(LeetCode376 摆动序列)

思路:i从1开始从左往右逐个遍历nums[i],维护一个flag变量记录nums[i-1]-nums[i-2](即前一个差值)。变量tmp记录nums[i]-nums[i-1](即当前差值),如果flag和tmp符号不同,则当前数可以加入摆动序列;否则跳过当前数,继续看下一个数字。其中一个是 [1, 17, 10, 13, 10, 16, 8] ,各元素之间的差值为 (16, -7, 3, -3, 6, -8)。整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3)。

2025-03-05 19:46:24 290

原创 刷题记录(LeetCode134 加油站)

可以使用反证法证明:如果存在区间[i, j]内的一点k,从k点出发可以循环一圈,那么k可以到达j,则区间[k, j]上的总油量一定大于等于总耗油量;从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油。开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油。

2025-03-04 19:21:26 291

原创 刷题记录(LeetCode122 买卖股票的最佳时机Ⅱ)

思路:本题的贪心策略是,只要后一天的价格低于今天的价格,那就今天卖出,否则不卖。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。

2025-03-03 15:45:52 337

原创 刷题记录(LeetCode56 合并区间)

思路:本题没说给的区间是否是有序的。如果是有序的,容易发现,可以合并的区间一定是连续的。如果当前区间的左边界小于等于上一个区间的右边界,说明两个区间可以合并,合并后的右区间为两个区间右边界中的较大值。本来以为要写一个重载函数来让sort根据左区间比较的,结果C++默认就是比较第一个元素哈。区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。表示若干个区间的集合,其中单个区间为。

2025-03-03 13:25:19 270

原创 刷题记录(LeetCode45 跳跃游戏Ⅱ)

边界end的意义是本次起跳能够跳到的最远位置,当i==end时,相当于检查了一遍区间[i, end](这里的i是上一次跳跃的落点,即我们找到的理想落点)中每一个点能够跳到的最大位置(通过更新maxCover),此时令end=maxCover,相当于我们选择跳到了理想落点。思路:本题的贪心策略是寻找能够跳到最远距离的位置去跳。需要注意的是,循环的终止条件是i<len-1,因为在最后一个位置时已经不需要再跳了,如果此时的边界end为最后一个位置,程序会原地跳一次,但是这一次显然是不需要的。向后跳转的最大长度。

2025-03-02 11:28:10 157

原创 刷题记录(LeetCode55 跳跃游戏)

维护一个全局最远覆盖范围maxCover,从头开始遍历nums数组,若当前位置在全局最远覆盖范围内,则将maxCover更新为max(i+nums[i], maxCover)。之后判断末尾是否在maxCover的范围内,若是则返回true,否则继续遍历。思路:本题可以转化为“求解能够到达的某个点的最远覆盖范围,从而确定全局最远覆盖范围,判断末尾是否在最远覆盖范围内”。可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。判断你是否能够到达最后一个下标,如果可以,返回。

2025-03-02 10:08:50 294

原创 刷题记录(LeetCode53 最大子数组和)

思路:从nums[0]开始遍历,设置sum变量记录当前的最大连续子数组和。对于当前位置i的数,如果sum+nums[i]要比nums[i]更大,则sum更新为sum+nums[i],表示nums[i]加入此前的连续子数组;否则更新为nums[i],重新以nums[i]为首寻找连续子数组。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。连续子数组 [4,-1,2,1] 的和最大,为 6。是数组中的一个连续部分。

2025-03-02 09:15:21 177

原创 刷题记录(LeetCode11 盛最多水的容器)

思路:首先,对于“长”来说,最理想的情况肯定是left在最左边(下标为0),right在最右边(size-1),所以我们将之设置为初始状态。之后我们要开始移动left和right,寻找更好的情况,此时无非只有两种情况:短板内移或长板内移(如果一样长,移动哪个都一样)。综上,我们发现,只有短板内移有可能使得容积变大,所以算法思路就是每次比较height[left]和height[right],将较小的板子内移,直至left>=right。①移动后的板子比原来的长。③移动后的板子比原来的长。

2025-03-01 09:55:15 239

原创 刷题记录(LeetCode 169 多数元素)

每一个士兵都要冲上阵地去抢夺这个阵地,如果当前阵地上没有其他阵营的士兵,则该士兵将己方的旗帜插在阵地上,该阵地归属该阵营;由于题目保证存在众数,我们举一个极端的例子:总共有100个数,其中有51个数是1,有49个数是2。③分治:有一个结论就是,如果某个数是全局的众数,那么从中间划分成左右两个子数组后,这个数一定也是某一子数组的众数。一直划分至区间长度为1,返回区间内的这个数。①排序:这应该是最容易想到的方法了,由于题目保证了多数元素(后面称众数)一定存在,那么如果将数组从小到大排序,中间位置一定就是答案。

2025-02-28 11:59:40 392

原创 刷题记录(LeetCode 50 Pow(x,n))

思路:如果按照一般的递归模板去写,写成myPow(x)=myPow(x, n-1)*x,在本题中会导致栈溢出,因为计算次数太多。PS:力扣给的C++板子的n默认是int类型,结果测试数据里n的大小超出了int的最大量。改成long就行了。对于负数,使用1/myPow(x, -n)即可。,这样计算次数就可以从原本的n降低为。

2025-02-28 09:43:51 183

原创 刷题记录(LeetCode153 寻找旋转数组中的最小值)

思路:假设数组中的最小元素为min,最后一个元素为high,可以发现,min右侧的元素严格小于high,min左侧的元素严格大于high。因此,在二分时,可以根据mid和high元素的大小来判断最小值在mid左边还是右边:如果nums[mid]小于nums[high],则min在mid左侧;原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。

2025-02-27 12:12:29 263

原创 刷题记录(LeetCode81 搜索旋转排序数组 Ⅱ)

思路:一开始以为和之前的旋转搜索是一样的,但是这道题里出现了重复元素,导致判断是否有序的时候可能会出现误判。例如nums=[1,0,1,1,1],target=0。第一次循环,mid=3,这个时候low、mid、high三个下标对应的值都是1,不能判断哪边是有序的。需要注意的是,不能用循环来进行low和high的移动,每移动一次就要重新判断low和high的大小关系,否则会出错(例如当low和high相等的时候)。,请你编写一个函数来判断给定的目标值是否存在于数组中。,数组中的值不必互不相同。

2025-02-27 10:42:07 154

原创 刷题记录(LeetCode69 x的平方根)

思路:这道题的标签是二分,但是题目里也没硬性限制复杂度,所以直接从头到尾遍历找第一个平方大于等于x的数就行了。这里用二分查找降低时间复杂度,初始时low=0,high=x。否则根据mid的平方和x的比较结果,判断是在左侧还是在右侧继续查找。循环退出后(表示整数里没有平方等于x的数),最后的mid的平方如果小于x,答案就是mid;我一开始用的int,结果超时了,我以为有别的办法不用计算平方,看了官方题解,原来是数据类型的问题。8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

2025-02-27 09:48:41 180

原创 刷题记录(LeetCode34 在排序数组中查找元素的第一个和最后一个位置)

PS:我看官方题解的思路是找第一个小于等于target的下标和第一个大于等于target的下标,感觉不太好理解。我这个理解起来可能更直观一些。思路:先用二分查找找到target,然后用从mid开始,用两个指针i和j,分别向前和向后找第一个target和最后一个target。请你找出给定目标值在数组中的开始位置和结束位置。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。如果数组中不存在目标值。

2025-02-26 19:42:46 181

原创 刷题记录(LeetCode33 搜索旋转排序数组)

但是二分查找的前提是数据整体有序,但是这道题是局部有序。可以发现,mid的左右两边一定有一边是有序的,所以在缩小范围的时候,得根据有序的那一边来缩小,如果target在有序的那一边,就把范围改变为那一侧的范围,否则就改变为另一侧。这是因为如果根据常规二分的话,target比mid小就去左边,但是如果左边并不是有序的,有可能左边都是比mid大的值。例如[4, 5, 6, 0, 1, 2, 3],target=2。此时按照常规二分,应该去0左边,但是实际上2在0右边。,则返回它的下标,否则返回。

2025-02-26 19:12:45 136

原创 刷题记录(LeetCode1047 删除字符串中的所有相邻重复项)

从原始字符串头部开始逐个遍历元素,如果当前栈顶元素和该字符相同,弹出栈顶元素,扫描下一个元素。由于栈先进后出的特点,直接从栈中弹出字符构成的字符串是反的。我使用了一个新的栈,将原栈弹出的元素push进新栈,然后再从新栈中弹出元素。例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。在完成所有重复项删除操作后返回最终的字符串。

2025-02-25 13:21:19 202

原创 刷题记录(LeetCode239 滑动窗口最大值)

若当前的nums[i]比队内的元素要大,那么在nums[i]入队后,比它小的元素肯定是不会成为最大值的,因此可以直接将其出队。当队列不为空时,nums[i]和队尾作比较,若队尾元素小,则队尾元素从队尾出队,之后进行新队尾和nums[i]的比较,直到某个队尾不小于nums[i]为止。需要注意的是,q队列中应该存储nums[i]的下标,否则可能出现明明不在窗口内的元素始终不出队的情况。思路:暴力求解的话,需要两层循环,外层循环遍历nums数组,内层循环遍历窗口找最大值,复杂度为O(你只可以看到在滑动窗口内的。

2025-02-24 19:54:33 428

原创 刷题记录(LeetCode20 有效的括号)

思路:经典的栈应用场景,解决括号匹配问题。如果是左括号直接入栈;如果是右括号,看栈顶元素是否是相匹配的左括号,若是,栈顶元素出站,否则匹配失败。,判断字符串是否有效。关键词:栈,括号匹配。

2025-02-24 16:51:42 213

原创 刷题记录(LeetCode160 相交链表)

这时令两个指针再次指向各自链表的头节点,而较长的链表指针前进A-B个位置,再让两个指针同步前进,则它们一定会在入口处相遇,此时返回节点即可。— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。

2025-02-24 15:43:24 1922

原创 刷题记录(LeetCode142 环形链表Ⅱ)

思路:快慢指针的方法和LeetCode 141的一致,需要解决的是如何确定环形入口的位置。设表头到入口的距离为D,第一次相遇时,慢指针slow走过的距离为D+K(其中K为入口到相遇点的距离)。由于快指针fast的步长是slow的2倍,所以fast走过的距离为2(D+K)。而fast比slow多走过的距离即为环长L,则有D+K+L=2(D+K),得到D=L-K,即表头到入口的距离等于相遇点再次回到入口的距离。此时将其中一个指针重置为head,两个指针以同样的步长(1)继续移动,再次相遇时的位置就是入口位置。

2025-02-22 11:03:18 256

原创 刷题记录(LeetCode141 环形链表)

算法的逻辑可以理解成操场跑步,假设两个人体力无限,可以一直跑,那么跑得快的人迟早会套圈跑得慢的人。所以开设fast和slow两个指针,步长分别设置为2和1,初始时fast在slow前一个位置,一直循环下去,只要fast和slow相等了,说明链表有环。更让人难绷的是,这个方法的空间复杂度还真就是O(1)。之后翻了一下题解区,果然有老哥跟我用了一样的方法,令我忍俊不禁的是评论区xdm的回复。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,判断链表中是否有环。

2025-02-22 09:49:52 398

原创 刷题记录(LeetCode25 K 个一组翻转链表)

在一组节点翻转完成后,q指向当前组的首个节点,此时注意要将该节点连接在上一个翻转完成组的最后一个节点后面。连接完成后,用tail更新pre,tail是在本组翻转前保存的组头节点,在翻转完成后变为组尾节点。对于每一组待翻转的节点,使用头插法的方式,开设一个空指针q,依次遍历该组中的节点(共计k次),将q赋值给当前节点p的next,随后令q=p,为下一个节点的插入做准备。同时,为了不丢失原本p的下一个节点,使用临时指针tmp记录下p->next,使p能够实现向后遍历。个节点一组进行翻转,请你返回修改后的链表。

2025-02-21 14:48:00 217

原创 刷题记录(LeetCode24 两两交换链表中的节点)

交换完成后,两个指针进行移位,指向下一对待交换的节点。交换完毕后,front所指向的节点在后,rear所指的节点在前。否则令front=front->next,然后再判断front->next是否为NULL,若是则结束(长度为奇数的情况),否则再令rear=front->next,实现移位,继续交换。需要注意的是,交换操作必须保持链表的连续性,通常可能会忽视rear所指的节点和前面节点(即原本front节点的前一个节点)的连接。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。

2025-02-21 14:20:24 315

原创 刷题记录(LeetCode19 删除链表的倒数第 N 个节点)

暴力的方法是首先遍历一遍整个链表,确定总长度sz后,可知倒数第n个位置的下标为sz-n,此时再次从头开始遍历至待删节点的前一个节点,即可执行删除操作。例如,在本题中,如果我们要删除节点y,我们需要知道节点y的前驱节点x,并将x的指针指向y的后继节点。下面采用双指针的方式,设置前后两个指针front和rear,令front和rear之间间隔n个节点,那么当rear到达表尾(即最后一个节点的下一个位置)时,front所指的节点即为待删除节点的前一个节点。这样一来,我们就不需要对头节点进行特殊的判断了。

2025-02-21 14:01:20 227 1

空空如也

空空如也

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

TA关注的人

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