22
33https://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- // 直接使用原来的链表来进行移除节点操作
7473class Solution {
7574public:
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- // 设置一个虚拟头结点在进行移除节点操作
111102class Solution {
112103public:
113104 ListNode* removeElements(ListNode* head, int val) {
0 commit comments