
leetcode-链表
Zhuchaoyun_
这个作者很懒,什么都没留下…
展开
-
leetcode-24.两两交换链表中的结点
24. 两两交换链表中的节点 - 力扣(LeetCode)解题:思路:三个指针将链表中的结点两两交换,我们需要用三个指针和头结点。改变指针之间的指向,便能让链表的位置发生改变。另外,改变指针的指向后,三个指针需要向后迭代两个位置(注意交换后结点的位置,在上述代码中虽然看似只往后迭代了一个位置,实际上为两次。因为交换结点后,结点的位置已经发生了改变,我将在后续的注意事项中详细解释)图中红色部分表示链表第一次进行交换时,指针指向的改变。灰色部分表示在指针迭代后,指针指向的改变(但图中有一点却是错误的:在第二次p原创 2025-04-29 15:28:59 · 232 阅读 · 0 评论 -
leetcode-61.旋转链表
一:这是一个链表,我们主动将链表变为环形链表。并设置指针分别指向他的头结点和第二个结点(注意1:prev和cur是否为空我们需要判断。思路:本题的思路很简单,就是将链表变为环形链表,然后通过计算在合理的位置断开链表,同时返回断开前的下一个结点的地址(及prev断开后,cur就成了头结点的指针)。二:(最重要的一点)图中代码,我们先将链表置为环,而当k%=count等于0时,如果不把cur的下一个指向置为空,那么我们返回的将是一个环形链表!二:当两个指针迭代到特定的位置后,我们变断开两个指针之间的链接。原创 2025-04-28 19:06:44 · 187 阅读 · 0 评论 -
leetcode-2.两数相加
第三:为什么 if(l1==NULL){return l2;我们需要构建一个哨兵结点,这样方便链表的构建,同时,还得考虑当两个相加大于10时,得有一个表示进位的变量。三:为什么return dummy.next;不能写成return dummy->next;一:struct ListNode dummy={1,NULL};二:为什么需要current->next->next = NULL;原创 2025-04-27 19:25:57 · 188 阅读 · 0 评论 -
牛客网-OR36:链表的回文结构(举一反三)
在循环while(tail)里,两个指针指向的数值的判断必须放在两个指针的遍历之前。否则,如果两个指针遍历后指向为空,那么循环直接结束,无法判断链表是否为回文链表。这时候通过cur指针与tail指针的遍历,如果他们遍历到最后为空,则链表为回文链表。如果在遍历过程中,两个指针指向的数值不同时,则链表不是回文链表。这一题需要前两篇博客的思路——寻找链表的中间结点和反转链表,通过前指针与尾指针的比较便可比较链表是否为回文链表。n1的初始化不能为slow,因为如果n1初始化为slow,那么n3便有越界访问的危险。原创 2025-04-26 18:17:28 · 123 阅读 · 0 评论 -
leetcode-147:对链表进行插入排序
sortprev的初始化有问题,应该将sortprev初始化为sorthead,而不是head,因为head是原链表的头指针,而原链表的头指针与新链表的头指针相同,冲突了。所以sortcur不为空的时候进行中间插入,当sortcur为空的时候进行尾插(注意:尾插不在循环内,请读者仔细看if(sortcur==NULL)的位置)对原链表进行遍历,当原链表(cur)的结点小于新链表(sorthead)的头结点时,便进行头插,反之便进行中间插入或尾插(中间插入和尾插放在一个假设里)。循环sortcur的指向。原创 2025-04-26 16:56:42 · 212 阅读 · 0 评论 -
牛客网-JZ76 删除链表中重复的结点
在cur的后面创建一个指针tmp,tmp指针用于遍历所有的重复的结点,并将tmp指针停留到重复结点中的最后一个结点。当遇到需要删除的结点时,我们将cur停在需要删除的结点的前一个位置,这样就不会链接到有重复的结点。注意:小编使用的是c语言的语法,虽然与c++兼容,但是某些地方不是很规范,请读者谅解。最后,将cur指针指向tmp指针的下一个结点,这样便删除了重复的结点。我们先创建一个哨兵结点,并将哨兵结点的地址指向链表的头结点。不会被执行(因为整个表达式已经确定为。在 C/C++ 中,逻辑运算符。原创 2025-04-23 20:09:14 · 242 阅读 · 0 评论 -
leetcode-138.随机链表的复制
因为原结点的random的指向是随机的,因此我们很难确定拷贝结点的random的指向。但记住一点:我们拷贝的新结点在原结点的下一个,那么新结点的random的指向是不是也应该在原结点random指向的下一个?我们可以在原链表里,在每一个结点的后面拷贝一个新的结点,使之将原链表扩大至两倍,且为一条链表(注意:拷贝的结点与原本的结点是相链接的,这样即拷贝了结点,也保证了结点的有序性)因为原本链表里的结点的random的指向是随机的,所以本题的难点不在于结点的拷贝,而在于拷贝后的结点的random是指向哪里的?原创 2025-04-23 17:26:46 · 264 阅读 · 0 评论 -
leetcode-142.环形链表||( 数学逻辑!)
题解:注意:为什么在上一题代码的修改下,代码依旧错误(其实为逻辑错误),以下解释摘要且总结于deep seek的回答,内容过于冗杂。精细的解释请前往官方答案查看fastslow如果链表只有 2 个节点且成环(),初始时(可能越界或逻辑错误)。更安全的初始化方式是,然后在循环中先移动再比较。假设链表结构如下(2 个节点,成环):head → [1] → [2] → [1] → [2] → ...(循环)直接指向head(即(指向[2](指向[1]fast->next是head(即[1]是[2]。原创 2025-04-20 19:23:58 · 709 阅读 · 0 评论 -
leetcode-141:环形链表
以为快指针比慢指针快一步(注意,如果是两步及两步以上不一定行),所以当快指针遍历完一次链表时,又通过环再次遍历链表,这样,哪怕在极限情况下,快指针遍历完一次链表后依旧能再次追上慢指针。在图片给出的例子中我们可以看到,在进入循环后,fast先执行,这时候,(fast在2的位置)fast指向的下一个为空,然而还得指向下一个,空的后面不能再指向某个地址。这是否危险(野指针)。二:为什么在循环中fast的值是否为空的判断(if (fast == NULL || fast->next == NULL))需要放在。原创 2025-04-20 16:11:50 · 300 阅读 · 0 评论 -
leetcode-160.相交链表
160. 相交链表 - 力扣(LeetCode)题解:详细思路请看leetcode官方的第二解题方式 注意:其中有两个错误:原代码 的终止条件是:找到相交节点()。或者两个指针同时走到 (说明无交点)。改为 后:只要 或 有一个为 ,循环就会终止。无法保证 ,因此可能提前退出循环,导致无法正确判断是否相交。如果链表不相交: 和 会先后变为 ,循环终止,但此时 可能返回 (正确)。如果链表相交:可能在 和 还未走到相交节点时,其中一个指针先变为 ,导致循环提前终止。此时 返回的是 或原创 2025-04-20 15:06:33 · 369 阅读 · 0 评论 -
leetcode-面试题02.04:分割链表
,那么这个large的链表的最后一个指针并未指向空,如果指向原始链表的结点便会形成环。再记录large的下一个结点,释放large这个哨兵结点,将psmall指向的下一个结点为large的下一个结点,这样便完成了。思维:将初始链表分为两个链表,一个(带small哨兵结点的链表)链表存储小于x的结点,一个链表(带large哨兵结点的链表)存储大于或等于x的结点。创建两个指针分别指向两个结点(psmall为small的指针,plarge为large的指针),这两个指针用于实现链表的存储。,便会造成内存泄露。原创 2025-04-19 20:45:48 · 187 阅读 · 0 评论 -
leetcode-21:合并两个链表
思维:先创建一个哨兵结点(头结点),再将两个链表中的结点依次插入带有哨兵结点的链表中。原创 2025-04-19 19:19:42 · 123 阅读 · 0 评论 -
牛客网-输入一个链表,输出该链表中倒数第k个结点。(题目已下线)
这里创建两个指针,一个前指针,一个后指针,当后指针往后迭代k次后,前指针与后指针一起往后迭代,最后返回前指针指向结点的值。当cur指针向后迭代k次后,prev指针与cur指针一起向后迭代。思考:我们也可以用链表结点的总数加1再减去k(总数+1-k)?例k=3,开始时,cur向后迭代3次,cur指向的值为4。输入一个链表,输出该链表中倒数第k个结点。原创 2025-04-19 18:13:58 · 114 阅读 · 0 评论 -
leetcode-876:链表的中间结点(快慢指针)
创建两个指针,一个快指针,一个慢指针。快指针一次走两步,慢指针一次走一步,当快指针遍历完链表时,慢指针正好停在链表的之间结点。当链表结点数为偶数时,快指针超出了链表的长度,及越界访问(危险),但我们返回的是慢指针,所以不受影响。注意:当链表结点数为奇数时,快指针正好停在最后一个结点。原创 2025-04-19 17:43:13 · 162 阅读 · 0 评论 -
leetcode-206:反转链表
n1与n2依旧需要向后迭代,但n3已是空指针,不能再继续向后迭代,所以n3需要一个触发条件,及当n3不为空的时候才能向后迭代,if(n3)。指针n3用于记录n2的下一个结点,以便于n1,n2往后迭代。指针n1,n2用来反转两个结点之间的指针。思路:迭代(三指针)注意:当出现这种情况。原创 2025-04-19 17:07:37 · 106 阅读 · 0 评论 -
leetcode-203:移除链表元素
程序会立即终止(在调试模式下会报错)。:当遇到要删除的节点时,代码直接修改指针跳过了该节点(,但实际应该先保存要删除的节点,再修改指针并释放内存。在删除节点时,先保存节点指针再释放内存,避免内存泄漏。第二:迭代过程中为什么会标记要删除数据的下一个结点?第一:为什么assert(head)会导致错误?),但没有释放被删除节点的内存。,应该被正确处理,而不是直接终止程序。原创 2025-04-19 16:13:58 · 100 阅读 · 0 评论