Skip to content

Commit 6a85b01

Browse files
author
oushihao
committed
feat(remove-linked-list-elements): 递归 | 迭代
1 parent 0eb2379 commit 6a85b01

File tree

7 files changed

+185
-0
lines changed

7 files changed

+185
-0
lines changed

assets/data/category.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,12 @@
271271
"path": "../../problemset/sort-list/README.md",
272272
"difficulty": "中等"
273273
},
274+
{
275+
"id": 203,
276+
"title": "移除链表元素",
277+
"path": "../../problemset/remove-linked-list-elements/README.md",
278+
"difficulty": "简单"
279+
},
274280
{
275281
"id": 432,
276282
"title": "全 O(1) 的数据结构",
@@ -1628,6 +1634,12 @@
16281634
"path": "../../problemset/number-of-islands/README.md",
16291635
"difficulty": "中等"
16301636
},
1637+
{
1638+
"id": 203,
1639+
"title": "移除链表元素",
1640+
"path": "../../problemset/remove-linked-list-elements/README.md",
1641+
"difficulty": "简单"
1642+
},
16311643
{
16321644
"id": 589,
16331645
"title": "N 叉树的前序遍历",

assets/data/problems.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,6 +1779,16 @@
17791779
"url": "https://leetcode-cn.com/problems/happy-number/",
17801780
"path": "../../problemset/happy-number/README.md"
17811781
},
1782+
{
1783+
"id": 203,
1784+
"title": {
1785+
"cn": "移除链表元素",
1786+
"en": "remove-linked-list-elements"
1787+
},
1788+
"difficulty": "简单",
1789+
"url": "https://leetcode-cn.com/problems/remove-linked-list-elements/",
1790+
"path": "../../problemset/remove-linked-list-elements/README.md"
1791+
},
17821792
{
17831793
"id": 258,
17841794
"title": {

assets/docs/CATEGORY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
| 146. [LRU缓存](../../problemset/lru-cache/README.md) | 中等 |
5454
| 147. [对链表进行插入排序](../../problemset/insertion-sort-list/README.md) | 中等 |
5555
| 148. [排序链表](../../problemset/sort-list/README.md) | 中等 |
56+
| 203. [移除链表元素](../../problemset/remove-linked-list-elements/README.md) | 简单 |
5657
| 432. [全 O(1) 的数据结构](../../problemset/all-oone-data-structure/README.md) | 困难 |
5758

5859
## 滑动窗口
@@ -325,6 +326,7 @@
325326
| 173. [二叉搜索树迭代器](../../problemset/binary-search-tree-iterator/README.md) | 中等 |
326327
| 199. [二叉树的右视图](../../problemset/binary-tree-right-side-view/README.md) | 中等 |
327328
| 200. [岛屿数量](../../problemset/number-of-islands/README.md) | 中等 |
329+
| 203. [移除链表元素](../../problemset/remove-linked-list-elements/README.md) | 简单 |
328330
| 589. [N 叉树的前序遍历](../../problemset/n-ary-tree-preorder-traversal/README.md) | 简单 |
329331
| 590. [N 叉树的后序遍历](../../problemset/n-ary-tree-postorder-traversal/README.md) | 简单 |
330332
| 606. [根据二叉树创建字符串](../../problemset/construct-string-from-binary-tree/README.md) | 简单 |

assets/docs/PROBLEMS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,8 @@
356356

357357
[202. 快乐数](../../problemset/happy-number/README.md)
358358

359+
[203. 移除链表元素](../../problemset/remove-linked-list-elements/README.md)
360+
359361
[258. 各位相加](../../problemset/add-digits/README.md)
360362

361363
[300. 最长递增子序列](../../problemset/longest-increasing-subsequence/README.md)
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# 移除链表元素
2+
3+
> 难度:简单
4+
>
5+
> https://leetcode-cn.com/problems/remove-linked-list-elements/
6+
7+
## 题目
8+
9+
给你一个链表的头节点 `head` 和一个整数 `val` ,请你删除链表中所有满足
10+
`Node.val == val` 的节点,并返回 **新的头节点**
11+
12+
### 示例
13+
14+
#### 示例 1
15+
16+
![remove-linked-list-elements](https://user-images.githubusercontent.com/54696834/159191813-06207770-83fa-4c1b-a7ee-cc765f7f9cfd.jpg)
17+
18+
```
19+
输入:head = [1,2,6,3,4,5,6], val = 6
20+
输出:[1,2,3,4,5]
21+
```
22+
23+
#### 示例 2
24+
25+
```
26+
输入:head = [], val = 1
27+
输出:[]
28+
```
29+
30+
#### 示例 3
31+
32+
```
33+
输入:head = [7,7,7,7], val = 7
34+
输出:[]
35+
```
36+
37+
## 解题
38+
39+
### 递归
40+
41+
```typescript
42+
/**
43+
* 递归
44+
* @desc 时间复杂度 O(N) 空间复杂度 O(N)
45+
* @param head
46+
* @param val
47+
* @returns
48+
*/
49+
export function removeElements(
50+
head: ListNode | null,
51+
val: number
52+
): ListNode | null {
53+
if (head === null) return head;
54+
head.next = removeElements(head.next, val);
55+
return head.val === val ? head.next : head;
56+
}
57+
```
58+
59+
### 迭代
60+
61+
```typescript
62+
/**
63+
* 迭代
64+
* @desc 时间复杂度 O(N) 空间复杂度 O(1)
65+
* @param head
66+
* @param val
67+
* @returns
68+
*/
69+
export function removeElements2(
70+
head: ListNode | null,
71+
val: number
72+
): ListNode | null {
73+
const dummyHead = new ListNode(0, head);
74+
let temp = dummyHead;
75+
while (temp.next !== null) {
76+
if (temp.next.val == val) {
77+
temp.next = temp.next.next;
78+
} else {
79+
temp = temp.next;
80+
}
81+
}
82+
return dummyHead.next;
83+
}
84+
```
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { ListNode, createListNode } from '~/utils/listNode';
2+
import { removeElements, removeElements2 } from '.';
3+
4+
describe('移除链表元素', () => {
5+
describe('递归', () => {
6+
testCase(removeElements);
7+
});
8+
9+
describe('迭代', () => {
10+
testCase(removeElements2);
11+
});
12+
});
13+
14+
function testCase(fn: (head: ListNode | null, val: number) => ListNode | null) {
15+
it('示例一', () => {
16+
const head = createListNode([1, 2, 6, 3, 4, 5, 6]);
17+
const val = 6;
18+
const expected = createListNode([1, 2, 3, 4, 5]);
19+
expect(fn(head, val)).toStrictEqual(expected);
20+
});
21+
22+
it('示例二', () => {
23+
const head = createListNode([]);
24+
const val = 1;
25+
const expected = createListNode([]);
26+
expect(fn(head, val)).toStrictEqual(expected);
27+
});
28+
29+
it('示例三', () => {
30+
const head = createListNode([7, 7, 7, 7]);
31+
const val = 7;
32+
const expected = createListNode([]);
33+
expect(fn(head, val)).toStrictEqual(expected);
34+
});
35+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { ListNode } from '~/utils/listNode';
2+
3+
/**
4+
* 递归
5+
* @desc 时间复杂度 O(N) 空间复杂度 O(N)
6+
* @param head
7+
* @param val
8+
* @returns
9+
*/
10+
export function removeElements(
11+
head: ListNode | null,
12+
val: number
13+
): ListNode | null {
14+
if (head === null) return head;
15+
head.next = removeElements(head.next, val);
16+
return head.val === val ? head.next : head;
17+
}
18+
19+
/**
20+
* 迭代
21+
* @desc 时间复杂度 O(N) 空间复杂度 O(1)
22+
* @param head
23+
* @param val
24+
* @returns
25+
*/
26+
export function removeElements2(
27+
head: ListNode | null,
28+
val: number
29+
): ListNode | null {
30+
const dummyHead = new ListNode(0, head);
31+
let temp = dummyHead;
32+
while (temp.next !== null) {
33+
if (temp.next.val == val) {
34+
temp.next = temp.next.next;
35+
} else {
36+
temp = temp.next;
37+
}
38+
}
39+
return dummyHead.next;
40+
}

0 commit comments

Comments
 (0)