移除链表元素
题目
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点
示例1:
输入: head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5}
思路
用一个虚拟头节点判断,最后返回虚拟头节点->next
代码
时间复杂度O(n)
空间复杂度O(1)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* cur = new ListNode(-1);//虚拟头节点
cur->next = head;
ListNode* loop = cur;
while(loop->next != NULL){
if(loop->next->val == val){
ListNode* temp = loop->next;//C++回收内存
loop->next = loop->next->next;
delete temp;
}else{
loop = loop->next;
}
}
head = cur->next;
delete cur;
return head;
}
};
另外有一种递归的思维来解决本题
基础情况:对于空链表,不需要移除元素。
递归情况:首先检查头节点的值是否为 val,如果是则移除头节点,答案即为在头节点的后续节点上递归的结果;如果头节点的值不为 val,则答案为头节点与在头节点的后续节点上递归得到的新链表拼接的结果。
时间复杂度O(n)
空间复杂度O(n)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 基础情况:空链表
if (head == nullptr) {
return nullptr;
}
// 递归处理
if (head->val == val) {
ListNode* newHead = removeElements(head->next, val);
delete head;
return newHead;
} else {
head->next = removeElements(head->next, val);
return head;
}
}
};