没有白走的路,每一步都要算数 文章目录 前言 一、反转链表题目 二、题目求解 1.迭代法求解 1.1 代码思路 1.2 代码图解 1.3 代码如下 2.递归法求解 1.1 代码思路 1.2 代码图解 1.3 代码如下 三、代码调试 1.题目中ListNode的结构类型 2.完整程序的代码 2.1 递归法求解 2.2 迭代法求解 ---- 前言 反转链表是一个超级大众的题目了。 但是反转链表能够考察到的知识点却是很多的 比如如何使用递归,迭代来反转链表。对于初学者学习递归和迭代都是一个不错的练习。 还有这种题目的数据结构都不会明确,只能以注释的形式出现,很多人不能够调试,看到运行的结果,很让人头疼,所以本文除了带你了解到如何使用python来求解反转链表,还会把整个的pythonACM模式的代码给全部显示出来演示 希望我可以一直写下去吧,见证学习成长之路也是一件很开心的事情 ---- 一、反转链表题目 二、题目求解 1.迭代法求解 1.1 代码思路 给定一个链表如1->2->3->4->5 设计的算法的目的是把链表转成
「---- Runsen」 ❞ 最近在重新梳理学算法的知识,本文为链表常见操作复习的总结文章,会讲解常见的链表题目实现思路及附上答案,这些题目在leetcode上对应的题号也有给出,好好学习算法吧~ 单链表反转 链表中环的检测 两个有序的链表合并 K个有序的链表合并 leetcode 对应题号:206,141,21,23 LeetCode 第 206 题:反转链表 反转一个单链表。 反转一个单链表需要当前节点的next指针指向上一个结点pre,当前节点的指针指向下一个结点,上一个结点的指针指向当前节点。 通过迭代,依次反转结点指向。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 从两链表第一个结点开始比较结点的值,取较小者作为合并链表的元素,依次进行;后面如果有一个链表为空,则直接把不为空的链表接到合并链表的后面
反转链表 力扣题目链接[1] 给你单链表的头节点 head,请你反转链表,并返回反转后的链表。 最终pre的指向就是翻转前链表的尾部节点,也是翻转后链表的头部,返回pre即可。 链表 /** * Definition for singly-linked list. 链表的中间结点 力扣题目链接[2] 给定一个头结点为 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 快指针每次走两步,慢指针每次走一步,当快指针走到链表尾部时,慢指针所处的位置就是链表的中间节点。 包括寻找链表的中间节点、检查链表是否存在环。都需要重点掌握。复杂度方面,时间复杂度是链表长度的一半,也就是O(n),维护了两个常数级别的变量,因此空间复杂度是O(1)。
我先画一个单链表,这个单链表有4个元素。我的思路就是,每次把第二个元素提到最前面来。 第一次交换 然后进行相同的交换将结点a3移动到结点a2的前面,然后再将结点a4移动到结点a3的前面就完成了反转。 ? 第二次交换 ? 第三次交换 思路有了,那就可以写代码了。 这里我们需要额外的两个工作指针来辅助交换。这个下面的步骤慢慢理解下,结合图片。注意结点之间的关系要先断再连。 \n8.置空链表"); 255 printf("\n9.链表反转逆序"); 256 printf("\n0.退出 \n请选择你的操作:\n"); 257 while(opp ! case '0': 332 exit(0); 333 } 334 } 335 return 0; 336 } 有两个方法可以实现单链表的反转
单向节点 OneWayNode 虽然代码用 java 实现,但涉及到的算法实现是通用的,希望大家不要被开发语言所禁锢 链表反转 基本上指的是单链表的反转,大家就认为是单链表的反转 ,变量赋值的顺序不是随便的,不信你们改变下顺序试试 如果没有任何限制,反转实现方式非常多;但面试时,往往会对时间复杂度或空间复杂度做一个极致的考量 这道题如果出现在面试中,那么考核点就是:时间复杂度 ,你会有惊喜,会发现有意思的新大陆 回文判断 何谓回文,就是反转之后与之前本身一样,例如 a,b,b,a 、 1,2,3,2,1 针对该问题,大家第一时间想到的肯定是二分法,但二分法是基于数组的 ,它不适用于单链表 那么如何判断单链表的回文了 那就按回文的描述那样,对原链表进行拷贝,然后反转拷贝的链表,再将原链表与新链表的值逐一对应比较,过程类似如下 代码如下 有个数据结构, ,那有没有额外空间复杂度为 O(1) 的方式了 有,同样用快慢指针,只是快指针走完后,慢指针以及它之后的链表元素不是入栈,而是反转,将反转后的链表与原链表逐一对应比较,如下图所示 代码实现
pre=cur; cur=temp; } return pre; } } 这里面 用到temp来代替cur的next , 要不然里面的 cur.next=pre 会错误的 结果: ?
单链表反转是面试中常考的一道题,这道题看起来简单,但是能一遍写出 bug free 的代码相当不容易,本文主要提供递归和迭代两种解题方法,供大家参考。 ? 题目 ? ? ? 举栗 ? 递归解法 链表具有天然的递归性,一个链表例如:1->2->3->NULL,可以看成以值为 1 的节点作为头节点后面挂接一个更短的(以值为 2 的节点为头节点)的链表,即1->更短的链表(以值为2的节点作为头节点 ),同理以值为2的节点作为头节点后面也挂接一个更更短的链表(以值为3的节点作为头节点);依次类推,如下图示。 有了这样的思考,链表反转就可以先翻转头节点后面挂接的更短的链表,然后再在翻转后的更短链表的后面挂接之前的头节点。具体如下图示: ? ? Show me the Code ? ); /* 将头节点(节点值为 1 的节点)挂接在翻转之后的链表的后面(也就是节点值为 2 的节点的后面) */ head->next->next = head;
反转链表这题真的是面试非常喜欢考的了,这题看起来简单,但是能用两种方法一遍 bug free 也是不容易的,面试的时候可以筛下来一大批人,无论是对 junior 还是 senior 面试都很爱考。 这是从力扣中文站上截下来的,但是这个输出不太形象。 对链表的反转,并不是要把它实际翻个个,只是动一动 next 指针就好了。 什么意思呢? 我们先看对数组进行反转。 数组是一个物理上连续存储的数据结构,反转之后原来放 1 的位置就变成了放 5. ? 但是链表并不是,因为链表在物理上是不连续的,它的每个单元 ListNode 是通过 next 指针连接在一起的,而每个 ListNode 之间在内存里并不一定是挨着的。 所以反转链表,就不是非要把 1 的位置放 5,因为它们想在哪在哪。 那么怎么保证这个顺序呢? 就是 next 指针。 沿着 next 指针的方向走下去,就是链表的顺序。
题目 给你一个链表的头节点 head 。 链表中的节点 按顺序 划分成若干 非空 组,这些非空组的长度构成一个自然数序列(1, 2, 3, 4, …)。一个组的 长度 就是组中分配到的节点数目。 反转 每个 偶数 长度组中的节点,并返回修改后链表的头节点 head 。 - 第二组长度为 2 ,偶数,节点反转。 - 第三组长度为 3 ,奇数,没有发生反转。 - 最后一组长度为 4 ,偶数,节点反转。 - 最后一组长度为 1 ,没有发生反转。 示例 4: 输入:head = [8] 输出:[8] 解释:只有一个长度为 1 的组,没有发生反转。 解题 链表反转 prevtail记录前一段的末尾,L, R 记录当前段的起始和结束,nthead 记录下一段的开始 /** * Definition for singly-linked list.
,反转该链表并输出反转后链表的头节点。 ,达到反转链表的目的。 解法二:递归 在线链接 当使用递归对链表进行处理时,从链表的第一个节点出发,然后找到最后一个节点,该节点就是反转链表的头结点,然后进行回溯处理。 初始链表的头结点,head 标识。 定义 reverseHead 节点,保存反转的链表值。 每次让 head 下一个节点的 next 指向 head,形成反转。 递归处理到最后一个节点,返回 reverseHead。 head.next.next = head; head.next = null; return reverseHead; }; 复杂度分析: 时间复杂度 O(N):n 是链表的长度,需要对链表的每个节点进行反转操作
1、背景 关于链表的反转,很多资料讲解不够清晰,参考“无鞋童鞋”原文:https://blog.csdn.net/fx677588/article/details/72357389 理解好了很多。 1、非递归(迭代)方式 迭代的方式是从链头开始处理,如下图给定一个存放5个数的链表。 首先对于链表设置两个指针: 然后依次将旧链表上每一项添加在新链表的后面,然后新链表的头指针NewH移向新的链表头,如下图所示。 首先指针H迭代到底如下图所示,并且设置一个新的指针作为翻转后的链表的头。由于整个链表翻转之后的头就是最后一个数,所以整个过程NewH指针一直指向存放5的地址空间。 ListNode newHead = reverseList(head.next); // 反转 head.next.next = head; head.next =
题目描述 输入一个链表,反转链表后,输出新链表的表头。 一 . 概念普及 关于线性表等相关概念请点击这里。 二 . 这里可以将单链表储存为数组,然后按照数组的索引逆序进行反转。此处,可理解为将链表装换为顺序表,然后把队伍方向反转,但是,此方式比较浪费空间,而且需要两次遍历,效率不占优势。 //指针是否为空判断(鲁棒性) if(head == null) { return null; } //定义新的链表 head = nodeList[startIndex]; return head; } 方法二:三指针法,不做过多阐述,代码备注蛮详细的。 //然后再把A和pHead都提前一位 A = pHead; pHead = B; } //循环结束后,返回新的表头,即原来表头的最后一个数
: 参考博客:https://www.jianshu.com/p/e385d9c06672 1、题目: 输入一个链表,反转链表后,输出新链表的表头。 2、解题思路: 2-1:第一种:使用递归方式: (1)解题思路: 假设链表为[1,2,3,4,5]先迭代到链表末尾5,然后从5开始依次反转整个链表。 如下图所示,先迭代待最后一位5,并且设置一个新的节点newList作为反转后链表的头结点,由于整个链表反转后的头就是最后一个数,所以newList存放的一直是反转后的头结点的地址,将head指向的地址赋值给 依次反转。。 2、解题思路: 比较两个链表的第一个节点,取出最小值的节点,接着再按照相同的方式重复比较剩余链表的节点。
每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,给一个新的链表结构,这样链表就实现了反转。 result.insert(0, listNode.val) listNode = listNode.next return result 剑指Offer(十五):反转链表 反转一个单链表。 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 1、思路 先判断输入的链表是否为空的指针。如果第一个链表为空,则直接返回第二个链表;如果第二个链表为空,则直接返回第一个链表。如果两个链表都是空链表,合并的结果是得到一个空链表。
也曾自己写过好多次的原地反转链表,无不以失败告终,最后不得不在O(N)的复杂度下草草收场。 // 源链表首节点后移 tempNode->next = nowHead; // 取出的节点接在目标链表的首部 nowHead = tempNode; // 目标链表首部更改为新的节点 } head->next = NULL; // 别忘了把原先的链表头指向NULL return nowHead; } // 目标链表首部更改为新的节点 } head->next = NULL; // 别忘了把原先的链表头指向NULL return nowHead; } ---- 调试验证 那么,现在用眼睛看出来的有: 1、取出环后节点; 2、反转成环; 3、破坏闭环; 4、返回第一步,直到退出条件成立。
前言: 在上期文章中,已经给大家分享过offsetof()和container_of两个宏函数,这两个宏函数在Linux内核链表里面有大量的应用,对于我们平时工作写代码有很大的帮助。 下面是Linux内核链表的内容分享。 struct list_head mylist = {&mylist, &mylist} ; 但是如果只是利用mylist这样的结构体实现链表就没有什么实际意义了,因为正常的链表都是为了遍历结构体中的其它有意义的字段而创建的 然后这个新的节点就变成了链表头后的第一个节点了。 2. list_add_tail 接口 : 上面所讲的list_add接口是从链表头header后添加的节点。同样,内核也提供了从链表尾处向前添加节点的接口list_add_tail.
文章目录 42.反转链表 数据范围 样例 思路 43.两个链表的第一个公共结点 数据范围 样例 空节点的三种写法 思路 44.删除链表中重复的节点 数据范围 样例1 样例2 思路 42.反转链表 定义一个函数 ,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 样例 输入:1->2->3->4->5->NULL 输出:5->4->3->2->1->NULL 思路 反转链表是一个经典题目 这里先判断头节点是否为空,或者仅存在一个节点,返回即可。 输入两个链表,找出它们的第一个公共结点。 在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留。
题目 每天一道leetcode92-反转m到n处的链表 分类:链表 中文链接: https://leetcode-cn.com/problems/reverse-linked-list-ii/ 英文链接 https://leetcode.com/problems/reverse-linked-list-ii/ 题目详述 反转从位置 m 到 n 的链表。 的 m等于1的话,简单,就是一个反转链表,如何反转见这篇文章,之前写过;m等于1的话,先反转m-n这些节点,反转完成以后,一开始的头结点就成了最后一个节点,所以反转前把这个节点保留下来,然后反转结束以后把后面的连起来就行 ,preFirst是temp节点的前一个节点,用来最后连接使用; 17-21行 因为是从第m个节点开始,所以先去找到这个第m个节点; 24-34行 就是反转链表了,不懂的看这篇文章,其中要注意的是,要把反转之前的第一个节点也就是 m所在的节点保留下来,这样方便最后连接没反转的后一段部分的节点; 35-36行 就是连接反转部分节点与前后两部分节点 38-50行 就是反转前1-n个节点的代码,反转链表看之前的链接,然后需要注意的就是把第一个节点保留下来用来连接
链表反转是一道很基础但又非常热门的算法面试题,它也在《剑指Offer》的第 24 道题出现过,至于它有多热(门)看下面的榜单就知道了。 ? ? 从牛客网的数据来看,链表反转的面试题分别霸占了【上周考过】和【研发最爱考】的双重榜单,像网易、字节等知名互联网公司都考过,但通过率却低的只有 30%,所以本文我们就来学习一下反转链表的两种实现方法。 反转链表 描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 反转链表 ListNode listNode = stack.pop(); // 反转第一个元素 ListNode lastNode = listNode; // 临时节点,在下面的 总结 本文我们分别使用了 Stack 和递归的方法实现了链表反转的功能,其中 Stack 的实现方式是利用了栈后进先出的特性可以直接对链表进行反转,实现思路和实现代码都比较简单,但在性能和内存消耗方面都不是很理想
• ID 429243 - 首选项:路径替换表未按预期扩展以容纳多行。• ID 429245 - 首选项:在首选项填充表行中的路径替换中错误地使用/ (斜杠)或空格,导致 UI 无法使用。 • ID 453338 - 安装程序:EULA 页面中的隐私声明链接未按预期工作。 • ID 466734 - CopyCat:停止在 CPU 上训练,然后在 GPU 上恢复,反之,从 GPU 到 CPU,没有按预期工作。 • ID 490627 - 创建合成:在项目设置中选择的默认监视器输出颜色变换未按预期应用到导出的.nk脚本中。 • ID 493069 - HieroPlayer:从右键单击上下文菜单中选择编辑>重命名镜头未按预期工作。
弹性容器服务(EKS)是腾讯云容器服务推出的无须用户购买节点即可部署工作负载的服务模式。弹性容器服务 EKS 兼容原生 Kubernetes,支持使用原生方式购买、管理资源,并扩展支持腾讯云的存储、网络等产品,开箱即用。弹性容器服务 EKS 按容器真实使用的资源量计费,腾讯云保证用户容器的安全隔离。
扫码关注腾讯云开发者
领取腾讯云代金券