<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[candygua的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/candygua</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; candygua]]></copyright><item><title><![CDATA[二叉树（七）--完全二叉树的节点个数]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/150273858</link><guid>https://blog.youkuaiyun.com/candygua/article/details/150273858</guid><author>candygua</author><pubDate>Tue, 12 Aug 2025 16:18:58 +0800</pubDate><description><![CDATA[层序遍历就是在计算有多少节点进入队列就好了，这个思路还是很简单的。递归也是记录每次走过的节点就好了，记住要+1（也就是节点本身）。这道题用两种方法来做，一是层序遍历，二是递归。]]></description><category></category></item><item><title><![CDATA[二叉树（六）--对称二叉树]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149545373</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149545373</guid><author>candygua</author><pubDate>Tue, 22 Jul 2025 19:32:37 +0800</pubDate><description><![CDATA[看到这个题的第一思路还是递归，但是递归方式得改变一下，看下面这个图，我们需要比较左子树外侧节点和右子树的外侧节点；还要比较左右子树的里侧节点。确定了执行逻辑，接下来解释确定终止条件，就是什么时候返回true什么时候返回false。有下面这四种情况：1.比较的两个节点都是空，证明就是递归完了，这个时候就返回true。2.比较的两个节点值不一样，返回false。3.比较的两个值一个是空节点另一个不是空节点，返回false。就这三种情况，理清楚这三种情况，代码就写完了。]]></description><category></category></item><item><title><![CDATA[二叉树（五）--翻转二叉树]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149541759</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149541759</guid><author>candygua</author><pubDate>Tue, 22 Jul 2025 18:21:57 +0800</pubDate><description><![CDATA[这道题是让我们将左右子树翻转，将左边的子树和右边的子树交换。这里我们利用前序遍历，利用swap函数将左右子树交换这道题就做完了。]]></description><category></category></item><item><title><![CDATA[二叉树（四）--层序遍历]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149440040</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149440040</guid><author>candygua</author><pubDate>Sun, 20 Jul 2025 22:05:14 +0800</pubDate><description><![CDATA[这道题是想让我们将完美二叉树的每层像链表一样连起来，从左往右连，最后一个节点指向NULL，这里我们可以创建两个前后节点，前节点来接每次循环的第一个节点，后节点用来更新前节点，不断向后更新，直到循环结束。这个题让我们从右边来看二叉树，换种思路来想，就是每层的最后一个元素，因为我们每层不是会放到队列里面嘛，所以要输出的元素不就可以从队列里面获取嘛，因为要输出右侧的，所以我们在进队列的时候就先进右子树的。这样这道题就做完了。这个题目是让我们求每层的平均值，求每层的平均值不就是求每次队列里面的值的平均值嘛？]]></description><category></category></item><item><title><![CDATA[二叉树（三）--后序遍历]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149421680</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149421680</guid><author>candygua</author><pubDate>Thu, 17 Jul 2025 14:43:46 +0800</pubDate><description><![CDATA[这里就不介绍递归的方法了，着重说一下迭代的方法，先序遍历是中左右，后序遍历是左右中，那么我们只需要调整一下先序遍历的代码顺序，就变成中右左的遍历顺序，然后在反转result数组，输出的结果顺序就是左右中了。]]></description><category></category></item><item><title><![CDATA[二叉树（二）--中序遍历]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149417416</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149417416</guid><author>candygua</author><pubDate>Thu, 17 Jul 2025 11:27:42 +0800</pubDate><description><![CDATA[这道题用两种遍历方式来做，递归和迭代，递归就是在调用root->left之后就进行输出值；这里重点说一下迭代，还是用栈来做这道题，因为中序遍历是先输出左下角的值，所以我们要先到最左下角，每走一步就压一个入栈，到了左下角再往回退，回退的操作就是从栈里面弹出元素。1.while的条件为cur!st.empty()。]]></description><category></category></item><item><title><![CDATA[二叉树（一）--前序遍历]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149415962</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149415962</guid><author>candygua</author><pubDate>Thu, 17 Jul 2025 10:49:29 +0800</pubDate><description><![CDATA[这道题用两种遍历方式来做，递归和迭代，递归就是在调用自身之前就进行输出值。这里重点说一下迭代。迭代需要一个栈来存每个节点。通过while循环去不断向下遍历，循环停止的标志是栈是否为空。每次循环先弹出栈顶元素，将这个元素放入res中。前序迭代遍历的思路和递归的思路有点类似。1.入栈的时候先入右节点再入左节点。]]></description><category></category></item><item><title><![CDATA[栈与队列（六）--滑动窗口最大值]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149402370</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149402370</guid><author>candygua</author><pubDate>Wed, 16 Jul 2025 17:20:53 +0800</pubDate><description><![CDATA[push（value）时，我们需要和队列里面的数值进行比较，如果push的值大，就将队列里的值弹出，如果是传统队列的话，不太方便处理，所以这里使用双向队列。这里我们可以使用一个while循环，不停的去比较value的值和队列back的值，如果value的值更大，就将back的值弹出，这样就可以保证队头的值是最大的。在这个题目中，我们没有必要去维护滑动窗口里面的每一个值，我们仅仅需要维护最大的那个值就好了，我们可以将最大的值放在最前面，这个时候就可以想到单调队列，但是这个队列需要我们自己来实现。]]></description><category></category></item><item><title><![CDATA[栈与队列（五）--逆波兰表达式求值]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149389163</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149389163</guid><author>candygua</author><pubDate>Wed, 16 Jul 2025 10:13:34 +0800</pubDate><description><![CDATA[逆波兰表达式求值是一种后缀表达式，这个特性是栈适合的，遇到数字就入栈，遇到运算符号就弹出两个数字，对这两个数字进行运算。1.记得运算时，后弹出的数字在前面。]]></description><category></category></item><item><title><![CDATA[栈与队列（四）--删除字符串中的所有相邻重复项]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149339152</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149339152</guid><author>candygua</author><pubDate>Mon, 14 Jul 2025 20:57:36 +0800</pubDate><description><![CDATA[遍历字符串，当字符串为空或者字符串尾元素跟元素不相等的时候插入字符。]]></description><category></category></item><item><title><![CDATA[栈与队列（三）--有效的括号]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149334851</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149334851</guid><author>candygua</author><pubDate>Mon, 14 Jul 2025 17:16:22 +0800</pubDate><description><![CDATA[首先明确一点，我们需要用栈来实现这个功能。有三种不匹配的情况，一是如果长度不是2的倍数肯定是不匹配的。二是括号不对应，如{]。三是左括号比右括号多，如{{{}。下面我们就用栈来实现一下，每当遇到左括号[{(时，我们就往栈里面插入右括号。如果遇到右括号就对比栈顶的符号，如果不匹配（第二种情况），肯定就是无效的。如果最后对比完了，栈中还有数据（第三种情况），也肯定是无效的。]]></description><category></category></item><item><title><![CDATA[栈与队列（二）--用队列实现栈]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149323932</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149323932</guid><author>candygua</author><pubDate>Mon, 14 Jul 2025 10:14:08 +0800</pubDate><description><![CDATA[这里我们需要有两个队列，一个是主队列，另一个是辅助队列。我们需要将主队列的数据移到辅助队列，只留下最后一个，这个是最后进来的，在栈中要最先出去，所以这个数据就是我们最先弹出的数据。处理完了之后，再将辅助队列的值拷贝到主队列。1.由于我们要留下一个数据，所以在while循环之前要对主队列的size-1。2.top()的时候记得push回top()的值。]]></description><category></category></item><item><title><![CDATA[栈与队列（一）--用栈实现队列]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149323080</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149323080</guid><author>candygua</author><pubDate>Mon, 14 Jul 2025 09:19:49 +0800</pubDate><description><![CDATA[栈是先进后出，队列是先进先出。所以如果要用栈来实现队列的功能我们可以创建两个栈，分别是一个in_stack和out_stack，先从in_stack进，再从in_stack到out_stack，最后从out_stack出，这样就实现了先进先出了。]]></description><category></category></item><item><title><![CDATA[链表（七）--环形链表 II]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149273395</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149273395</guid><author>candygua</author><pubDate>Fri, 11 Jul 2025 14:18:01 +0800</pubDate><description><![CDATA[这里说得很明白了，相遇点到环入口的距离就等于头节点到环入口的距离。此时我们就仅仅需要再创建两个指针，一个指向头节点，一个指向相遇节点，两者以此向前进，直到两者相等。这个相等的地方就是环的入口。我们需要先判断链表是否有环，做法是使用双指针，慢指针走一步，快指针走两步。如果有环的话，快慢指针一定会相遇。相遇点就如下面这个图所示。1.快慢指针相遇点到环入口的距离就是头节点到环入口的距离。]]></description><category></category></item><item><title><![CDATA[链表（六）--链表相交]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149182873</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149182873</guid><author>candygua</author><pubDate>Mon, 07 Jul 2025 23:01:29 +0800</pubDate><description><![CDATA[我们先需要求出两个链表的长度，计算插值n，让长的链表先移动n步；然后再让两个链表同时移动，如果有环，就能走到一起。1.注意在求完链表长度的时候记得。2.比较两者的时候是比较的。]]></description><category></category></item><item><title><![CDATA[链表（五）--删除链表的倒数第N个节点]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149174160</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149174160</guid><author>candygua</author><pubDate>Mon, 07 Jul 2025 15:30:33 +0800</pubDate><description><![CDATA[如果要删除倒数第n个节点，让fast移动n+1步，然后让fast和slow同时移动，直到fast指向链表末尾的后一个节点（NULL），这时的slow是指向要删除节点的前一个节点，符合我们前面的做法，要删除一个节点，需要指向该节点的前一个节点。最后我们删除这个节点就好了。1.还是建立一个虚假的头节点，让快慢指针。步，while的结束条件为。，这样确保慢指针能指向。]]></description><category></category></item><item><title><![CDATA[链表（四）--两两交换链表中的节点]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149160275</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149160275</guid><author>candygua</author><pubDate>Sun, 06 Jul 2025 23:03:26 +0800</pubDate><description><![CDATA[（不包括虚假头节点）。按照下图的三个步骤来操作链表，因为按照题目，链表肯定是成对出现的，所以在while判断是否终止循环的时候就仅仅需要判断cur->next和cur->next->next是否为空指针就好了。这里需要创建两个临时变量用来保存当前对的第一个和下一对的第一个，图中就是1和3。（cur->next和cur->next->next->next），因为这两个变量刚刚好能顾及到当前循环的所有节点。2.每次更新cur节点，cur都是每对节点的前一个节点，所以更新cur的时候需要向后。]]></description><category></category></item><item><title><![CDATA[链表（三）--反转链表]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149159506</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149159506</guid><author>candygua</author><pubDate>Sun, 06 Jul 2025 22:23:05 +0800</pubDate><description><![CDATA[这里思想也和之前的一样，新建立一个虚假的头节点，因为我们需要翻转链表，这里的虚假头节点反转之后就是新链表的尾节点，所以就是NULL。让cur等于实际头节点，pre等于NULL，运用。2.因为要while循环到链表的最后一位，所以while的终止条件是cur，这个时候cur是NULL，最后返回的是cur的前一个节点就是pre。（cur->next），因为要改变cur->next = pre，所以提前保存一下。，向后更新，最终反转链表。]]></description><category></category></item><item><title><![CDATA[链表（二）--移除链表元素]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149154675</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149154675</guid><author>candygua</author><pubDate>Sun, 06 Jul 2025 16:32:54 +0800</pubDate><description><![CDATA[这里我们创建一个虚拟的头节点，用上一篇博客中说的规律，让LinkedNode* cur 停在需要移除节点的前一个节点，我们再创建一个临时变量tmp=cur->next，那么这个tmp就是我们要删除的元素了，看上面这个图，删除这个元素，仅仅是需要将cur的next直接指向tmp的next。然后在delete tmp，就完成了。]]></description><category></category></item><item><title><![CDATA[链表（一）--设计链表]]></title><link>https://blog.youkuaiyun.com/candygua/article/details/149154422</link><guid>https://blog.youkuaiyun.com/candygua/article/details/149154422</guid><author>candygua</author><pubDate>Sun, 06 Jul 2025 16:24:07 +0800</pubDate><description><![CDATA[在后续做题时为了不混淆，可以统一将需要删除或者增加节点时，就停在该节点的前一个节点。而是查询值的时候就设置LinkedNode* cur = fakehead->next;1.对于题目中的按照index来插入或者删除的题目，如果设置LinkedNode* cur = fakehead;在后续的while循环中while(index--)，结束是在index的。2.在尾插的时候，通过while(cur->next!3.任何增删链表后，记得改变size。对于链表我们采用在头节点之前创建一个。]]></description><category></category></item></channel></rss>