【DFS】天子呼来不上船,自称臣是酒中仙 - 2.递归

【DFS】天子呼来不上船,自称臣是酒中仙 - 2.递归
在这里插入图片描述
本篇博客给大家带来的是DFS深度优先遍历的解法技巧,在后面的文章中题目会涉及到回溯和剪枝,遇到了一并讲清楚.
🐎文章专栏: DFS
🚀若有问题 评论区见
❤ 欢迎大家点赞 评论 收藏 分享
如果你不知道分享给谁,那就分享给薯条.
你们的支持是我不断创作的动力 .

王子,公主请阅🚀

要开心

要快乐

顺便进步

1. 反转链表

题目链接:206. 反转链表

题目内容:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

在这里插入图片描述


示例 3:

输入:head = []
输出:[]

提示:

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000



题目链接:link

题目内容:

一. 分析


如果按前序遍历的顺序递归能不能解决这道题?
答案是解决不了.

在这里插入图片描述


如上图, 当我修改完节点2的时候,需要往下一个节点修改,但此时2的next节点变成两个了,分别是节点1和节点3,这个时候就会出问题,所以舍弃前序遍历改用后序遍历.


二. 后序遍历递归的具体步骤

第一种分析方式 微观角度(dfs函数在做什么)来分析
1. 重复子问题(函数头)
子问题就是反转链表, ListNode dfs(ListNode head)

2. 只关心某一个子问题在做什么

在这里插入图片描述


在这里插入图片描述


第二种分析方式 宏观角度来分析
1. 明确dfs的含义
dfs函数就是把链表反转并将新的头节点返回

在这里插入图片描述


如上图例子中,从宏观角度看就是将2节点到5节点反转返回新的头节点,2~5的新链表与1形成的链表再将1反转.
2. 怎么将1反转?(函数体)

在这里插入图片描述



3. 递归出口
当链表只有一个节点或者当前节点为null时,无需反转直接return head即可.

三. 代码实现
classSolution{publicListNodereverseList(ListNode head){returndfs(head);}publicListNodedfs(ListNode head){if(head ==null|| head.next ==null){return head;}ListNode newHead =dfs(head.next); head.next.next = head; head.next =null;return newHead;}}

2. 两两交换链表中的节点

题目链接:24. 两两交换链表中的节点

题目内容:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

在这里插入图片描述


提示:

链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100

一. 宏观角度分析

1. 明确dfs的含义
两两交换节点并返回新的头节点.

在这里插入图片描述


如上图例子,除第一第二个节点,其余节点两两交换,返回新的头节点tmp, 只有一个节点或者节点为null就不用交换.

2. 第一第二个节点如何交换?

在这里插入图片描述


3. 递归出口
只有一个节点或者节点为null就不用交换,直接返回头节点.

二. 代码实现
classSolution{publicListNodeswapPairs(ListNode head){returndfs(head);}publicListNodedfs(ListNode head){if(head ==null|| head.next ==null){return head;}ListNode tmp =dfs(head.next.next);ListNode ret = head.next; head.next.next = head; head.next = tmp;return ret;}}

总结: 宏观角度总给人代码会出错的不自信, 但是分析起来是非常方便,快捷的. 能用则用,实在不行,再从微观角度慢慢分析.

本篇博客到这里就结束啦, 感谢观看 ❤❤❤
🐎期待与你的下一次相遇😊😊😊

Read more

超酷!前端人必备的 3 个 Skills:搞定高级 UI,拿捏最佳实践,最后一个直接拉满“续航”!

最近和几位前端开发者聊天,发现一个有趣的现象:AI 写代码越来越快,但代码质量的差距反而越来越大。 有人用 Cursor 写出来的页面,一眼就能看出是 AI 生成的——紫色渐变背景、Inter 字体、千篇一律的卡片布局。而有的人用同样的工具,却能产出让人眼前一亮的作品。 差距在哪里?不在 AI 工具本身,而在于你给 AI 注入了什么样的"技能包" 。 今天想分享前端开发必备的三个 Skills。前两个是干货分享,能立刻提升你的代码质量;第三个可能出乎你的意料,但确实是我最近的真实体会。 Skill 1: 让 AI 懂设计,告别"AI 味"的界面 你有没有遇到过这种情况——AI 生成的页面虽然能用,但总觉得哪里不对劲? 布局平庸、配色单调、

By Ne0inhk
进阶数据结构: AVL树

进阶数据结构: AVL树

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go! 我的博客:yuanManGan 我的专栏:C++入门小馆 C言雅韵集 数据结构漫游记  闲言碎语小记坊 题山采玉 领略算法真谛 目录 AVL相关概念:  AVL树的结构 Insert  旋转 右旋: 编辑 左单旋:  右左双旋: 左右双旋:  完整的插入: 其他简单的操作:  测试: AVL相关概念: AVL树是由二叉搜索树加上一定的限制而形成的树,AVL树:它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树, 通过控制⾼度差去控制平衡。

By Ne0inhk
我爱学算法之—— 二分查找(下)

我爱学算法之—— 二分查找(下)

一、寻找峰值 题目解析 对于这道题,给定一个数组nums,在这数组中,可能存在多个峰值元素,我们只需找到一个峰值,然后返回峰值索引即可。 峰值元素:严格大于左右相邻的元素。 题目中给定:nums[0]和nums[n]可以看做负无穷。 算法思路 对于这道题,首先暴力解法:遍历整个数组,依次判断一个元素它是不是峰值元素。 暴力解法的时间复杂度是O(n);并且暴力解法它并没有用到题目中给的:nums[0]和nums[n]可以看做负无穷这一个条件。 当我们遍历i位置时,有且仅有两种情况:递增/递减(题目给定 nums[i] != nums[i+1])。 当i位置呈现递增趋势时,也就是nums[i] > nums[i+1],题目又给出nums[0] = nums[

By Ne0inhk