LeetCode 203. 移除链表元素

题目描述

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

示例 1:

203

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

示例 2:

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

示例 3:

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

提示:

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

思路

cur 表示当前节点,如果 cur 的下一个节点不为空且下一个节点的节点值等于给定的 val ,则需要删除下一个节点。如果 cur 的下一个节点的节点值不等于给定的 val ,则保留下一个节点,将 cur 移动到下一个节点即可。

cur 的下一个节点为空时,链表遍历结束,此时所有节点值等于 val 的节点都被删除。

具体实现方面,由于链表的头节点 head 有可能需要被删除,因此创建哑节点 dummyHead ,令 dummyHead -> next=head,初始化 cur = dummyHead,然后遍历链表进行删除操作。最终返回 dummyHead -> next 即为删除操作后的头节点。

203dummy

C++代码

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
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode * dummyHead = new ListNode(0);
dummyHead -> next = head; // // 将虚拟头结点指向head,这样方便后面做删除操作
ListNode * cur = dummyHead;
while (cur -> next) {
if (cur -> next -> val == val) {
ListNode * tmp = cur -> next;
cur -> next = cur -> next -> next;
delete tmp;
} else {
cur = cur -> next;
}
}
return dummyHead -> next;
}
};
  • 时间复杂度O(n)
  • 空间复杂度O(1)