203. 移除链表元素
cpp
class Solution {
public:
ListNode *removeElements(ListNode *head, int val)
{
// 头结点
ListNode *l = new ListNode();
l->next = head;
ListNode *p = l;
while (p->next != nullptr) {
if (p->next->val == val) {
ListNode *tmp = p->next->next;
delete p->next;
p->next = tmp;
}
else {
p = p->next;
}
}
head = l->next;
delete l;
return head;
}
};思路
正如我在我的博客文章 中说的那样,链表带不带这个虚拟头结点会影响链表操作的一致性,这里也是一样的。这个题他原来的数据没有给你这个虚拟头结点,head上来就指向了数据结点,很不好。所以我们要自己去创建一个虚拟头结点。
用new去申请内存搞一个结点,让这个结点的next指向题目给的head。
然后以这个虚拟头结点为起点,往后看p->next这个结点是不是符合要求的结点,符合就删。用的C++,记得释放内存
改进后代码
cpp
class Solution {
public:
ListNode *removeElements(ListNode *head, int val)
{
// 头结点
ListNode *l = new ListNode();
l->next = head;
ListNode *p = l;
while (p->next != nullptr) {
if (p->next->val == val) {
ListNode *tmp = p->next->next;
p->next = p->next->next;
delete tmp;
}
else {
p = p->next;
}
}
head = l->next;
delete l;
return head;
}
};