(一)题目描述

在这里插入图片描述


(二)题目意图

删除head链表中所有的val == Node.val的结点,最终返回头结点。


(三)题目分析

  • head结点和非头结点的删除方式不同
  • 是否使用伪头结点

我的错误分析:误以为head中的val不作为val==head->val的条件,所以未对head结点进行处理。
未考虑到的:head结点为nullptr


(四)画图分析

例如:删除[6,2,6,3,4,5,6]中的6

(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
31
32
//不使用伪头结点
class Solution {
public:
ListNode* removeElements(ListNode* head, int val){

//删除头结点
//头结点不为nullptr head->val == val
while(head != NULL && head->val == val)
{
ListNode* tmp = head;
head = head->next;
delete tmp;
}

//删除非头结点
ListNode* p = head;
while(p != NULL && p->next != NULL)
{
if(p->next->val == val)
{
ListNode* tmp = p->next;
p->next = p->next->next;
delete tmp;
}
else
{
p = p->next;
}
}
return head;
}
};

(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
//使用伪头结点
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* tmphead = new ListNode(0, head);
//tmphead->val = 0; tmphead->next = head;

ListNode* p = tmphead;
while(p->next != NULL )
{
if(p->next->val == val)
{
ListNode* tmp = p->next;
p->next = p->next->next;
delete tmp;

}
else
{
p = p->next;
}
}
head = tmphead->next;
delete tmphead;
return head;
}
};