Skip to content

Commit 84fe2e4

Browse files
Update
1 parent ef76ad8 commit 84fe2e4

9 files changed

+101
-29
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ int countNodes(TreeNode* root) {
362362
|[0202.快乐数](https://github.com/youngyangyang04/leetcode/blob/master/problems/0202.快乐数.md) |哈希表 |简单|**哈希**|
363363
|[0203.移除链表元素](https://github.com/youngyangyang04/leetcode/blob/master/problems/0203.移除链表元素.md) |链表 |简单|**模拟** **虚拟头结点**|
364364
|[0205.同构字符串](https://github.com/youngyangyang04/leetcode/blob/master/problems/0205.同构字符串.md) |哈希表 |简单| **哈希**|
365-
|[0206.翻转链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0206.翻转链表.md) |链表 |简单| **模拟** **递归**|
365+
|[0206.翻转链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0206.翻转链表.md) |链表 |简单| **双指针法** **递归**|
366366
|[0209.长度最小的子数组](https://github.com/youngyangyang04/leetcode/blob/master/problems/0209.长度最小的子数组.md) |数组 |中等| **暴力** **滑动窗口**|
367367
|[0219.存在重复元素II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0219.存在重复元素II.md) | 哈希表 |简单| **哈希** |
368368
|[0222.完全二叉树的节点个数](https://github.com/youngyangyang04/leetcode/blob/master/problems/0222.完全二叉树的节点个数.md) ||简单| **递归** |

problems/0206.翻转链表.md

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,34 @@ https://leetcode-cn.com/problems/reverse-linked-list/
44

55
## 思路
66

7-
其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示
7+
如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。
8+
9+
其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示:
810

911
<img src='../pics/206_反转链表.png' width=600> </img></div>
1012

11-
## 代码
13+
之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改表next指针的方向。
14+
15+
那么接下来看一看是如何反转呢?
16+
17+
我们拿有示例中的链表来举例,如动画所示:
18+
19+
<video src='../video/206.翻转链表.mp4' controls='controls' width='640' height='320' autoplay='autoplay'> Your browser does not support the video tag.</video></div>
20+
21+
首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。
22+
23+
然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。
24+
25+
为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。
26+
27+
接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。
28+
29+
最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。
30+
31+
## C++代码
1232

1333
### 模拟算法
1434
```
15-
/**
16-
* Definition for singly-linked list.
17-
* struct ListNode {
18-
* int val;
19-
* ListNode *next;
20-
* ListNode(int x) : val(x), next(NULL) {}
21-
* };
22-
*/
2335
class Solution {
2436
public:
2537
ListNode* reverseList(ListNode* head) {

problems/0344.反转字符串.md

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,38 @@ https://leetcode-cn.com/problems/reverse-string/
1515

1616
接下来我们再来讲一下如何解决反转字符串的问题。
1717

18+
这道题目遍历数组的前一半,同时和后一半做交换就可以了。
1819

19-
这道题目遍历数组的前一半,同时和后一半做交换就可以了
20+
<img src='../video/344.反转字符串.gif' width=600> </img></div>
2021

21-
此时我们再看一下代码实现
22+
C++代码如下:
23+
```
24+
void reverseString(vector<char>& s) {
25+
for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {
26+
swap(s[i],s[j]);
27+
}
28+
}
29+
```
30+
31+
循环里只要做交换s[i] 和s[j]操作就可以了,那么我这里使用了swap 这个库函数,因为知道交换函数如何实现, 而且库函数仅仅是解题中的一部分, 所以这里使用库函数也是可以的。 swap可以有两种实现。
32+
33+
一种就是常见的交换数值。
34+
```
35+
int tmp = s[i];
36+
s[i] = s[j];
37+
s[j] = tmp;
38+
39+
```
40+
一种就是通过位运算。
41+
42+
```
43+
s[i] ^= s[j];
44+
s[j] ^= s[i];
45+
s[i] ^= s[j];
46+
47+
```
2248

23-
## 代码
49+
## C++代码
2450

2551
```
2652
class Solution {

problems/0450.删除二叉搜索树中的节点.md

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,45 @@ https://leetcode-cn.com/problems/delete-node-in-a-bst/
33

44
## 思路
55

6-
平衡二叉树中删除节点有三种情况
6+
平衡二叉树中删除节点一下五种情况:
77

8-
* 没找到删除的节点,遍历到空节点直接返回了
8+
* 第一种情况:没找到删除的节点,遍历到空节点直接返回了
99
* 找到删除的节点
10-
* 左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
11-
* 其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
12-
* 其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
13-
* 左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
10+
* 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
11+
* 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
12+
* 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
13+
* 第五种情况:左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
1414

15+
第五种情况有点难以理解,看下面动画:
16+
17+
动画中颗二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右孩子的最左面节点是元素8。
18+
19+
将将删除节点(元素7)的左孩子放到删除节点(元素7)的右孩子的最左面节点的左孩子上,就是把5为根节点的子树移到了8的左孩子的位置。
20+
21+
接着删除节点(元素7)右孩子为新的根节点。(click)也就是元素7位根节点的树,现在的根节点变成元素9的根节点的树了.
22+
23+
<video src='../video/450.删除二叉搜索树中的节点.mp4' controls='controls' width='640' height='320' autoplay='autoplay'> Your browser does not support the video tag.</video></div>
24+
25+
26+
27+
这样就完成删除元素7的逻辑,也可以动手画一个图,尝试删除一个节点试试。
28+
29+
代码如下:(详细注释)
1530

1631
## C++代码
1732

1833
```
1934
class Solution {
2035
public:
2136
TreeNode* deleteNode(TreeNode* root, int key) {
22-
if (root == NULL) return root;
37+
if (root == NULL) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了
2338
if (root->val == key) {
24-
// 第一种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
25-
// 第二种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
39+
// 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
40+
// 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
2641
if (root->left == NULL) return root->right;
27-
// 第三种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
42+
// 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
2843
else if (root->right == NULL) return root->left;
29-
// 第四种情况:左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子的位置
44+
// 第五种情况:左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子的位置
3045
// 返回删除节点右孩子为新的根节点。
3146
else {
3247
TreeNode* cur = root->right;

problems/0707.设计链表.md

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,29 @@
1-
## 题目地址
1+
# 题目地址
22

33
https://leetcode-cn.com/problems/design-linked-list/
44

5-
## 思路
5+
> 听说这道题目把链表常见的五个操作都覆盖了?
66
7-
如果链表的基础知识还不太懂,可以看这篇文章:[关于链表,你该了解这些!](https://mp.weixin.qq.com/s/ntlZbEdKgnFQKZkSUAOSpQ)
7+
# 第707题:设计链表
8+
9+
题意:
10+
11+
在链表类中实现这些功能:
12+
13+
* get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
14+
* addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
15+
* addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
16+
* addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
17+
* deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
18+
19+
20+
![707示例](https://img-blog.csdnimg.cn/20200814200558953.png)
21+
22+
# 思路
23+
24+
如果对链表的基础知识还不太懂,可以看这篇文章:[关于链表,你该了解这些!](https://mp.weixin.qq.com/s/ntlZbEdKgnFQKZkSUAOSpQ)
25+
26+
如果对链表的虚拟头结点不清楚,可以看这篇文章:[链表:听说用虚拟头节点会方便很多?](https://mp.weixin.qq.com/s/slM1CH5Ew9XzK93YOQYSjA)
827

928
删除链表节点:
1029
![链表-删除节点](https://img-blog.csdnimg.cn/20200806195114541.png)
@@ -26,7 +45,7 @@ https://leetcode-cn.com/problems/design-linked-list/
2645
1. 直接使用原来的链表来进行操作。
2746
2. 设置一个虚拟头结点在进行操作。
2847

29-
下面我采用的设置一个虚拟头结点(这样更方便一些,大家看代码就会感受出来)。
48+
下面采用的设置一个虚拟头结点(这样更方便一些,大家看代码就会感受出来)。
3049

3150

3251
## 代码

video/206.翻转链表.mp4

897 KB
Binary file not shown.

video/344.反转字符串.gif

343 KB
Loading

video/344.反转字符串.mp4

430 KB
Binary file not shown.
429 KB
Binary file not shown.

0 commit comments

Comments
 (0)