LeetCode | 203 | 移除链表元素 | 迭代法 | 虚设头节点 | 递归 | 三种方法

链表入门题!虚设头节点做链表:屡试不爽

LeetCode链接:203. 移除链表元素

1.题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

示例 1:

img

1
2
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

1
2
输入:head = [], val = 1
输出:[]

示例 3:

1
2
输入:head = [7,7,7,7], val = 7
输出:[]

提示:

  • 列表中的节点数目在范围 $[0, 10^4]$ 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

2.题解

2.1 直接法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public ListNode removeElements(ListNode head, int val) {
// 处理特殊情况,如果链表为空,直接返回 null
// if (head == null) return null;

// 如果要删除的节点是头节点,更新头节点为下一个节点
while (head != null && head.val == val) {
head = head.next;
}

// 创建指针 pre,用于遍历链表,初始化为当前头节点
ListNode pre = head;

// 遍历链表
while (pre != null) {
// 如果下一个节点不为空且下一个节点的值等于需要删除的值 val
if (pre.next != null && pre.next.val == val) {
// 跳过下一个节点,实现删除操作
pre.next = pre.next.next;
} else {
// 否则,移动指针到下一个节点
pre = pre.next;
}
}

// 返回删除指定值后的链表头节点
return head;
}
}

2.2 虚设头节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public ListNode removeElements(ListNode head, int val) {
// 处理特殊情况,如果链表为空,直接返回 null
// if (head == null) return null;

// 创建一个新的头节点 newHead,指向原链表的头节点 head
// 这样可以方便处理删除头节点的情况
ListNode newHead = new ListNode(0, head);

// 创建指针 pre,初始化为 newHead,用于指示要删除的节点的前一个节点
ListNode pre = newHead;

// 开始迭代,寻找要删除的节点
while (pre != null) {
// 如果下一个节点不为空且下一个节点的值等于需要删除的值 val
if (pre.next != null && pre.next.val == val) {
// 跳过下一个节点,实现删除操作
pre.next = pre.next.next;
} else {
// 否则,移动指针到下一个节点
pre = pre.next;
}
}

// 返回删除指定值后的链表头节点(即原链表的头节点)
return newHead.next;
}
}

2.3 递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
//递归法 三步走
//1.确定参数和返回值
public ListNode removeElements(ListNode head, int val) {
// 2. 确定终止条件:当链表遍历到 null 节点时,返回 null
if (head == null) return null;

// 3. 确定单层递归逻辑:
// 递归处理当前节点的下一个节点,并更新当前节点的 next 指针
head.next = removeElements(head.next, val);

// 返回当前节点:如果当前节点的值等于要删除的值,则返回它的 next 节点;否则返回当前节点
return head.val == val ? head.next : head;
}
}

-------------本文结束感谢您的阅读-------------