Skip to content

Commit a54a31a

Browse files
Update
1 parent 304e409 commit a54a31a

File tree

5 files changed

+70
-43
lines changed

5 files changed

+70
-43
lines changed

problems/0142.环形链表II.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ fast指针走过的节点数: x + y + n (y + z),n为fast指针在环内走
6565
当 n为1的时候,公式就化解为 `x = z`
6666

6767

68-
这就意味着,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点
68+
这就意味着,**从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点**
6969

7070

7171
也就是在相遇节点处,定义一个指针index1,在头结点处定一个指针index2。

problems/0203.移除链表元素.md

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@
22

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

5-
## 思路
5+
# leetcode:203. 移除链表元素
6+
题意:删除链表中等于给定值 val 的所有节点。
7+
示例:
8+
输入: 1->2->6->3->4->5->6, val = 6
9+
输出: 1->2->3->4->5
610

7-
我们这里以链表 1 4 2 4 来举例,移除元素4
11+
# 思路
12+
13+
我们这里以链表 1 4 2 4 来举例,移除元素4。
814

915
<img src='../pics/203_链表删除元素1.png' width=600> </img></div>
1016

@@ -14,63 +20,56 @@ https://leetcode-cn.com/problems/remove-linked-list-elements/
1420

1521
**当然如果使用java ,python的话就不用手动管理内存了。**
1622

17-
还要说明一下,就算我们使用C++来做leetcode,如果移除一个节点之后,没有手动在内存中删除这个节点,leetcode依然也是可以通过的,只不过,内存使用的空间大一些而已,但建议依然要养生手动清理内存的习惯,因为在面试中 这些细节都是面试官考察的点
23+
还要说明一下,就算我们使用C++来做leetcode,如果移除一个节点之后,没有手动在内存中删除这个节点,leetcode依然也是可以通过的,只不过,内存使用的空间大一些而已,但建议依然要养生手动清理内存的习惯
1824

1925
这种情况下的移除操作,就是让节点next指针直接指向下下一个节点就可以了,
2026

21-
那么因为单链表的特殊性,只能指向下一个节点,我们刚刚删除的是 链表的中第二个,和第四个节点,那么如果我们删除的是头结点 又该怎么办呢
22-
23-
这里就涉及到 链表操作的两种方式,**一种是 直接使用原来的链表来进行删除操作,一种是设置一个虚拟头结点在进行删除操作。**
27+
那么因为单链表的特殊性,只能指向下一个节点,我们刚刚删除的是链表的中第二个,和第四个节点,那么如果我们删除的是头结点又该怎么办呢?
2428

29+
这里就涉及如下链表操作的两种方式:
30+
* **直接使用原来的链表来进行删除操作。**
31+
* **设置一个虚拟头结点在进行删除操作。**
2532

2633

27-
我们来看第一种操作 直接使用原来的链表来进行移除
34+
我们来看第一种操作直接使用原来的链表来进行移除
2835

2936
<img src='../pics/203_链表删除元素3.png' width=600> </img></div>
3037

31-
移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点
38+
移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点
3239

33-
所以头结点如何移除呢,其实我们只要 将头结点向后移动一位就可以,这样我们就从链表中移除了一个头结点
40+
所以头结点如何移除呢,其实我们只要将头结点向后移动一位就可以,这样我们就从链表中移除了一个头结点
3441

3542
<img src='../pics/203_链表删除元素4.png' width=600> </img></div>
3643

3744

38-
依然别忘将原头结点从内存中删掉
45+
依然别忘将原头结点从内存中删掉
3946
<img src='../pics/203_链表删除元素5.png' width=600> </img></div>
4047

4148

42-
这样我们移除了一个头结点,是不是发现,在单链表中移除头结点 和 移除其他节点的操作方式是不一样,其实在我们写代码的时候也会发现,需要单独写一段逻辑来处理 移除头结点的情况
49+
这样我们移除了一个头结点,是不是发现,在单链表中移除头结点 和 移除其他节点的操作方式是不一样,其实在我们写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况
4350

4451
那么可不可以 以一种统一的逻辑来移除 链表的节点呢。
4552

46-
其实我们可以设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除了。
53+
其实**可以设置一个虚拟头结点**,这样原链表的所有节点就都可以按照统一的方式进行移除了。
4754

4855
我们来看看如何设置一个虚拟头。我们依然还是在这个链表中,移除元素1。
4956

50-
5157
<img src='../pics/203_链表删除元素6.png' width=600> </img></div>
5258

53-
这里我们来给链表添加一个虚拟头结点为新的头结点,此时我们要移除这个旧头结点 元素1,
59+
这里我们来给链表添加一个虚拟头结点为新的头结点,此时我们要移除这个旧头结点元素1。
60+
61+
这样是不是就可以使用和移除链表其他节点的方式统一了呢?
5462

55-
这样是不是就可以使用 和移除链表其他节点的方式统一了呢
63+
来看一下,如何移除元素1 呢,还是我们熟悉的方式,然后从内存中删除元素1。
5664

57-
大家来看一下,如何移除元素1 呢,还是我们熟悉的方式,然后从内存中删除元素1
65+
最后呢在题目中,return 头结点的时候,别忘了 `return dummyNode->next;`, 这才是新的头结点
5866

59-
最后呢在题目中,return 头结点的时候,别让了 `return dummyNode->next;`, 这才是新的头结点
6067

68+
# C++代码
6169

62-
## 代码
70+
**直接使用原来的链表来进行移除节点操作:**
6371

6472
```
65-
/**
66-
* Definition for singly-linked list.
67-
* struct ListNode {
68-
* int val;
69-
* ListNode *next;
70-
* ListNode(int x) : val(x), next(NULL) {}
71-
* };
72-
*/
73-
// 直接使用原来的链表来进行移除节点操作
7473
class Solution {
7574
public:
7675
ListNode* removeElements(ListNode* head, int val) {
@@ -97,17 +96,9 @@ public:
9796
};
9897
```
9998

99+
**设置一个虚拟头结点在进行移除节点操作:**
100100

101101
```
102-
/**
103-
* Definition for singly-linked list.
104-
* struct ListNode {
105-
* int val;
106-
* ListNode *next;
107-
* ListNode(int x) : val(x), next(NULL) {}
108-
* };
109-
*/
110-
// 设置一个虚拟头结点在进行移除节点操作
111102
class Solution {
112103
public:
113104
ListNode* removeElements(ListNode* head, int val) {

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ https://leetcode-cn.com/problems/delete-node-in-a-bst/
55

66
平衡二叉树中删除节点有三种情况
77

8-
1. 找到删除的节点,其左节点为空,那么就返回其右节点
9-
2. 找到删除的节点,其右节点为空,那么就返回其左节点
10-
3. 找到删除的节点,左右孩子节点都不为空,则将左孩子放到右孩子的最左面的节点的左孩子上。
8+
* 没找到删除的节点,遍历到空节点直接返回了
9+
* 找到删除的节点
10+
* 左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
11+
* 其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
12+
* 其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
13+
* 左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
1114

1215

1316
## C++代码
@@ -18,9 +21,14 @@ public:
1821
TreeNode* deleteNode(TreeNode* root, int key) {
1922
if (root == NULL) return root;
2023
if (root->val == key) {
21-
if (root->left == NULL) return root->right; // 第一种情况
22-
else if (root->right == NULL) return root->left; // 第二种情况
23-
else { // 第三种情况
24+
// 第一种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
25+
// 第二种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
26+
if (root->left == NULL) return root->right;
27+
// 第三种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
28+
else if (root->right == NULL) return root->left;
29+
// 第四种情况:左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子的位置
30+
// 返回删除节点右孩子为新的根节点。
31+
else {
2432
TreeNode* cur = root->right;
2533
while(cur->left != NULL) {
2634
cur = cur->left;

problems/0701.二叉搜索树中的插入操作.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,35 @@ https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/
33

44
## 思路
55

6+
其实这道题目是一道很简单的题目,**但是题目中的提示:有多种有效的插入方式,还可以重构二叉搜索树,一下子吓退了不少人**,瞬间感觉题目复杂了很多。
7+
8+
其实**可以不考虑题目中提示所说的改变树的结构的插入方式。**
9+
10+
如下演示视频中可以看出:只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。
11+
12+
例如插入元素10 ,需要找到末尾节点插入便可,一样的道理来插入元素15,插入元素0,插入元素6,**需要调整二叉树的结构么? 并不需要。**只需要遍历二叉搜索树,找到空节点 插入元素就可以了, 那么这道题其实就非常简单了。
13+
14+
<video src='../video/701.二叉搜索树中的插入操作.mp4' controls='controls' width='640' height='320' autoplay='autoplay'> Your browser does not support the video tag.</video></div>
15+
16+
接下来就是遍历二叉搜索树的过程了。
17+
18+
代码如下:
619

720
## C++代码
821

922
### 递归
1023
```
24+
/**
25+
* Definition for a binary tree node.
26+
* struct TreeNode {
27+
* int val;
28+
* TreeNode *left;
29+
* TreeNode *right;
30+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
31+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
32+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
33+
* };
34+
*/
1135
class Solution {
1236
public:
1337
TreeNode* insertIntoBST(TreeNode* root, int val) {
@@ -24,6 +48,10 @@ public:
2448

2549
### 迭代
2650

51+
在来看看迭代法
52+
53+
在迭代法遍历的过程中,需要记录一下当前遍历的节点的父节点,这样才能做插入节点的操作。
54+
2755
```
2856
class Solution {
2957
public:
488 KB
Binary file not shown.

0 commit comments

Comments
 (0)