首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

题型篇 | 数据结构与算法之链表系列

2、栈实现 从头到尾遍历单链表,将数据存储按照顺序存储到栈中。然后遍历整个栈,打印输出数据。...3、递归实现 可以通过递归的方式来实现单链表从尾到头依次输出,递归过程涉及到“递”和“归”,反转链表输出数据,正式利用了循环“递”的过程,所以数据先从头部输出,那么递归采用的是“归”的过程来输出内容,输出当前结点先要输出当前节点的下一节点...关于递归重复计算问题,我们通常使用自下而上的解决思路(动态规划)来解决递归重复计算的问题。 ▉ 注意事项 1、涉及到循环解决的问题,可以想一想能不能使用递归来解决。...2、操作上 递归:链表中的很多操作都是可以用递归来进行解决的,因为链表的每个结点都有着相同的结构,再加上解决的问题可以分解为子问题进行解决。所以在链表中递归编程技巧还是非常常用的。...如:从尾到头打印链表、合并两个有序链表、反转链表等。 双指针:链表中大部分都是进行指针操作,链表属于线性表结构(形如一条线的结构),很多问题可以使用双指针来解决,也是非常常用到的。

61110

经典算法——单向链表反转

给定如下如下链表的节点定义: struct LinkNode { int value; LinkNode* next; }; 比如有一个链表是这样的,1->2->3->4->5,反转后成为 5->4...迭代实现 2.1 分析 实现链表反转,我们需要从第二个节点开始遍历,将当前节点的 next 指向前一个节点。这里需要注意的是,该变当前节点的 next 时,需要提前保存 next,不然遍历就会中断。...return pre; } 2.3 验证 // //@brief: main.cpp // #include using namespace std; //@brief: 打印单向链表...此种方法可以使用递归来实现。 时间复杂度 O(n); 空间复杂度 O(n)。 由于每次递归都需要为实参分配空间,所以相较于非递归实现,较为耗费栈空间,且不易理解。...NULL || head->next == NULL) { return head; } LinkNode * newhead = ReverseList(head->next); //先递后归

8K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    二叉树小结及习题—展开为链表

    代表每个树都会按照中间节点、左节点、右节点的方式排序,上述例子的前序排列就是:1、2、4、 5、 3、6、7 中序。...我们试着在递的过程中加入打印: //二叉树的递归 void traverse(TreeNode root) { if (root==null) return // 前序遍历点 System.out.println...),traverse(2),traverse(4) traverse(5) traverse(3),traverse(6),traverse(7) 同样,在递和归直接打印节点就是中序遍历,在归阶段打印节点就是后序遍历...题目 再来个题目进行巩固:二叉树展开为链表 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为...所以我们可以把3子树作为5这个链表节点的下一个指针指向。 这样一个个节点处理完之后,链表结构就出来了,比如上述的例子: 第一步:把5作为3子树的前驱节点。

    45060

    🛰️ 递归思想

    无限递归(递而不归、死递归),栈溢出(函数的调用有时间和空间的开销,一个程序中同时调用的函数个数是有限的)。...图片递归函数分为两类:在递去的过程中解决问题在归来的过程中解决问题举例说明:图片递去过程中解决问题:前面人手中的子弹总数加上自己手上的,告诉下一个人,最后把子弹总数回传给上一个人。...图片归来的过程中解决问题:把消息传递下去,让最后的人把手中的子弹数告诉前一个人,前一个人加上后一个人告知的数量,继续向前传递。图片递归函数的参数在每次调用时应该是不同的!...如何在递归和循环之间选择?一般情况下,当循环方法比较容易实现时,应该避免使用递归。...当很难简历一个循环方法时,递归可能是一个很好的选择(某些情况下,递归方法总是显而易见的,而循环方法却是难以实现)某些数据结构(树)本身就是递归时,则使用递归也是最好的方法了。

    803161

    递归和迭代

    一.递归(Recursion) 1.递归:以相似的方式重复自身的过程 2.递归在程序中表现为:在函数的定义中直接或间接调用函数自身 3.递归和循环: (1)递归是有去(递去)有回(归来),因为存在终止条件...,比如你打开一扇门还有一扇门,不断打开,最终你会碰到一面墙,然后返回 (2)循环是有去无回,但可以设置终止条件,比如你打开一扇门还有一扇门,不断打开,还有门,没有终点 4.递归的递去和归来: (1)递归的递去...,例如,汉诺塔问题,…); (3) 数据结构是递归的(链表、树等的操作,包括树的遍历,树的深度,…) 7.递归的优缺点 (1)递归的优点:简洁,容易处理问题,代码可读性高 (2)时间和空间消耗大 8.递归式求解的基本方法...迭代则使用计数器结束循环。...,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归, 5.迭代在程序中的表示: (1)必须设置计数器,可以通过计数设置或条件设置,否则会一直迭代 (2)必须有返回值可以作为再次迭代的初值

    69630

    前端学数据结构与算法(四):理解递归及拿力扣链表题目练手

    如何写递归代码 举一个例子,求解字符串的逆序,如abcd返回dcba,请使用递归。 1....子问题就是让最后一个节点指向它之前的节点。首先还是递的过程,我们需要递到最后一个节点。...两两交换链表中的节点↓ 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...环形链表↓ 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。...当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明:给定的 n 保证有效。 进阶尝试:你能尝试使用一趟扫描实现吗?

    59200

    【在Linux世界中追寻伟大的One Piece】信号捕捉|阻塞信号

    信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。在上图的例子中,SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作。...3.3 -> 可重入函数 main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的时候,因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,...于是切换到sighandler函数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的两步都做完之后从sighandler返回内核态,再次回到用户态就从main...结果是,main函数和sighandler先后向链表中插入两个节点,而最后只有一个节点真正插入链表中了。...标准I/O库的很多实现都以不可重入的方式使用全局数据结构。

    8410

    【Linux】信号

    如上图,一个循环打印,另一个用kill函数。运行结果如下图,使用kill函数终止了进程。 raise 作用:谁调用这个函数,它就给调用者发送指定信号。 kill是给任意进程发送任意信号。...注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。 在内核中的表示 信号在内核中的表示示意图 每个进程pcb中会维护三张表。...可重入函数 main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的时候,因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换到sighandler...函数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的 两步都做完之后从 sighandler返回内核态,再次回到用户态就从main函数调用的insert函数中继续往下执行...结果是,main函数和sighandler先后向链表中插入两个节点,而最后只有一个节点真正插入链表中了。 node2丢失,内存泄露了。

    7910

    【Linux进程信号】Linux信号机制深度解析:保存与处理技巧

    ,直到进程解除对此信号的阻塞,才执行递达的动作 注意:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作 在内核中的表示 在Linux内核中,信号的保存主要依赖于三种数据结构...换句话说,这种函数在执行的任何时刻都可以被中断,然后在中断点恢复执行而不会导致错误 main函数调用 insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的 时候,...因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换 到sighandler函数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的 两步都做完之后从...结果是,main函数和sighandler先后 向链表中插入两个节点,而最后只有一个节点真正插入链表中 insert函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入,insert...我们不仅掌握了信号的捕获和处理技巧,还学会了如何在实际开发中灵活运用这些技巧来解决实际问题 学习之路永无止境。

    16310

    Linux进程信号详解【下】

    信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。在上图的例子中,SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作即SIG_DFL。...main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的 时候,因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换 到sighandler...函数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的 两步都做完之后从sighandler返回内核态,再次回到用户态就从main函数调用的insert函数中继续...结果是,main函数和sighandler先后 向链表中插入两个节点,而最后只有一个节点真正插入链表中了。...简单来说,就是在head节点后插入一个新节点,但是在插入过程中需要从用户态转内核态,而前面说了,进程在内核态的时候会顺便检查信号,这时刚好收到信号,执行自定义捕捉,而自定义捕捉也是在head后插入一个节点

    9610

    【蓝桥杯Java_C组·从零开始卷】第七节、递归

    使用递归需要注意哪些问题? 递归思想解决了哪些经典的问题? 是什么递归? 定义    在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。...实际上,递归,顾名思义,其包含了两个意思:递 和 归,这正是递归思想的精华所在。 递归的精髓(思想)是什么?    正如上面所描述的场景,递归就是有去(递去)有回(归来),如下图所示。...明确递归终止条件    我们知道,递归就是有去有回,既然这样,那么必然应该有一个明确的临界点,程序一旦到达了这个临界点,就不用继续往下递去而是开始实实在在的归来。...i--; // 递去 return f(i);// 递到最深处后,不断地归来 } } } 递归的应用场景 在我们实际学习工作中,递归算法一般用于解决三类问题...问题的解法是递归的(有些问题只能使用递归方法来解决,例如,汉诺塔问题,…); (3). 数据结构是递归的(链表、树等的操作,包括树的遍历,树的深度,…)。

    33010

    进程信号

    信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。在上图的例子中,SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作。...main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的 时候,因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换 到sighandler...函数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的 两步都做完之后从sighandler返回内核态,再次回到用户态就从main函数调用的insert函数中继续...结果是,main函数和sighandler先后 向链表中插入两个节点,而最后只 有一个节点真正插入链表中了。...标准I/O库的很多实现都以不可重入的方式使用全局数据结构。

    1.3K20

    学了链表牛刀小试,三种做法都吃透就算是学会了

    因为我们根本没有利用好给定我们的链表,额外地消耗了内存空间。所以如果在面试当中遇到,面试官是不会只满足于听到这样的回答的。那么,我们又该如何在不创建新链表的前提下完成翻转呢?...比如在这题当中,我们要使用递归来实现reverseList函数。我们先假设,它能够在比当前更小的范围内运行。...head tmp->next = head; head->next = nullptr; return cur; } }; 改进 这里我们为了求出链表最后一个节点在递归当中使用了循环...但这样的话,我们就修改了返回值的类型,所以就要单独写一个递归来实现了。整体的原理和刚才是一样的,只不过我们稍作加工,让递归能够既返回头节点也返回尾节点。我们就不用再去额外遍历了。...那就是对于链表来说,我们可以在任何节点插入元素。既然如此,我们既可以每次插入在末尾,自然也可以插入在头部。如果我们每次插入元素都在头部的话,得到的链表中的元素顺序刚好和之前相反。

    25420

    leetcode 递归编程技巧-链表算法题

    开篇问题1:leetcode 141:环形链表 题目描述:   给定一个链表,判断链表中是否有环。   如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。...为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。...注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。   如果链表中存在环,则返回 true 。否则,返回 false 。 示例: 解题思路: 实用快慢指针的思想。...快慢指针就是使用上述的原理,slow指针一次走一步,quick指针一次走两步。通过这样的方式遍历整个链表。如果没相遇就说明没有环,就像高速公路。如果彼此相遇了,说明有环,就像学校操场上的环形跑道。...这就是一个非常标准的递归求解问题的分解过程,去的过程叫“递”,回来的过程叫“归"。基本上,所有的递归问题都可以用递推公式来表示。

    34420

    【刷题】初探递归算法 —— 消除恐惧

    -- 康德 《实践理性批判》 1 递归算法 在解决一个规模为 n 的问题时,如果满足以下条件,我们可以使用递归来解决: 问题可以被划分为规模更小的子问题,并且这些子问题具有与原问题相同的解决方法。...下面我们通过一个具体实例来展示如何在实践中解决问题: 假设我们要计算斐波那契数列中的第 n 项。...算法思路 相信大家看到这个题,肯定有迭代循环思路,但是今天我们通过递归来解决问题: 我们首先分析一下: 当前问题:当我们处理当前情况时,我们需要把后续处理交给黑盒,我们需要的是将较小的节点插入到新链表中...题目描述 同样很好理解,接下来我们来使用递归解决问题 算法思路 首先这道题需要注意的一点是:我们要先找到新链表的头(即当前链表的尾节点)黑盒的返回值设置为新链表的头,然后再来进行反转。...两两交换链表中的节点 跟上节奏:24. 两两交换链表中的节点 !!! 题目描述: 题目也很好理解奥 算法思路 我们依旧是使用递归来解决: 当前问题:置换两个节点,并指向后续以及置换完成的链表。

    11310

    【Linux】信号>信号产生&&信号处理&&信号保存&&信号详解

    阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作 3.2 在内核中的表示 信号在内核中的表示示意图 每个信号都有两个标志位分别表示阻塞(block)和未决(pending...信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。...在上图的例子中,SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作 SIGINT信号产生过,但正在被阻塞,所以暂时不能递达。...函数向同一个链表head中插入节点node2,插入操作的两步都做完之后从sighandler返回内核态,再次回到用户态就从main函数调用的insert函数中继续往下执行,先前做第一步之后被打断,现在继续做完第二步...结果是,main函数和sighandler先后向链表中插入两个节点,而最后只有一个节点真正插入链表中了 像上例这样,insert函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入

    18310

    数据结构之链表

    链表的常见操作包括:插入(Insertion): 在链表中插入一个新节点。删除(Deletion): 从链表中删除一个节点。搜索(Search): 查找链表中特定元素。...单向链表还支持其他操作,如删除节点、查找节点等,具体操作可以根据需要自行扩展。...我们创建了链表的头节点和尾节点,并插入一个新节点。然后,我们展示了如何在前向和后向两个方向上遍历链表并打印节点的数据。双向链表的实现可以根据需要进行扩展,包括插入、删除、查找节点等操作。...然后,我们遍历前10个节点并打印它们的数据。由于链表是循环的,遍历可以无限继续,我们在示例中只遍历了前10个节点。循环链表的实现可以根据需要进行扩展,包括插入、删除、查找节点等操作。...声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

    30720

    LeetCode每日一题-3:回文链表

    示例 1: 输入: 1->2输出: false 示例 2: 输入: 1->2->2->1输出: true 思路分析: 迭代法: 避免使用 O(n)O(n) 额外空间的方法就是改变输入。...我们可以将链表的前(后)半部分反转(修改链表结构),然后将前半部分和后半部分进行比较。比较完成后我们应该将链表恢复原样。虽然不需要恢复也能通过测试用例,但是使用该函数的人通常不希望链表结构被更改。...在并发环境下,函数运行时需要锁定其他线程或进程对链表的访问,因为在函数执行过程中链表会被修改。 整个流程可以分为以下步骤: 找到前(后)半部分链表的尾节点。 反转(前)后半部分链表。 判断是否回文。...Python实现 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): #...算法的正确性在于递归处理节点的顺序是相反的,而我们在函数外又记录了一个变量,因此从本质上,我们同时在正向和逆向迭代匹配。 所谓递归,即从上往下递下去,然后再从下往上归回来。

    19620
    领券