目录
1.原题链接:
2.双指针(无虚拟头结点):
先定义两个指针:
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val)
{
ListNode* pre=NULL;
ListNode* cur=head;
return head;
}
遇到目标结点:
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val)
{
ListNode* pre=NULL;
ListNode* cur=head;
while(cur!=NULL)
{
if(cur->val==val)
{
pre->next=cur->next;
free(cur);
cur=pre->next;
}
else
{
// pre=pre->next;//不能这么写,因为会存在对空指针的访问,当最初pre为NULL时
pre=cur;
cur=cur->next;
}
}
return head;
}
特殊情况:
所以,要做一下特殊处理:
这样就解决了上述问题(只需要在满足 cur->val==val 条件时,再加上一种情况)。
代码实现:
①.C语言版:
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val)
{
ListNode* pre=NULL;
ListNode* cur=head;
while(cur!=NULL)
{
if(cur->val==val)
{
if(cur==head)
{
head=cur->next;
free(cur);
cur=head;
}
else
{
pre->next=cur->next;
free(cur);
cur=pre->next;
}
}
else
{
pre=cur;
cur=cur->next;
}
}
return head;
}
②.C++版:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val)
{
ListNode* pre=NULL;
ListNode* cur=head;
while(cur!=NULL)
{
if(cur->val==val)
{
if(cur==head)
{
head=cur->next;
delete(cur);
cur=head;
}
else
{
pre->next=cur->next;
delete(cur);
cur=pre->next;
}
}
else
{
pre=cur;
cur=cur->next;
}
}
return head;
}
};
3.哨兵(虚拟头结点):
其实我们可以不这么麻烦,不就是多了一种头结点的值等于目标值的情况吗,那我们把这种情况去掉不就全是一般情况了吗。所以,我们可以使用虚拟头结点。
代码实现:
①.C语言版:
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val)
{
ListNode* newHead=(ListNode*)malloc(sizeof(ListNode));//创建一个虚拟头结点
newHead->next=head;
ListNode* pre=newHead;
ListNode* cur=head;
while(cur!=NULL)
{
if(cur->val==val)
{
pre->next=cur->next;
free(cur);
cur=pre->next;
}
else
{
pre=cur;
cur=cur->next;
}
}
return newHead->next;//不能返回head哦,有可能head这个结点已经被我们删掉了(当head->val==val)
}
②.C++版:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* newHead=new ListNode(0,head);//创建一个虚拟头结点
ListNode* pre=newHead;
ListNode* cur=head;
while(cur!=nullptr)
{
if(cur->val==val)
{
pre->next=cur->next;
delete(cur);
cur=pre->next;
}
else
{
pre=cur;
cur=cur->next;
}
}
return newHead->next;//不能返回head哦,有可能head这个结点已经被我们删掉了(当head->val==val)
}
};
其实这个题也可以用递归方法解决,但是我认为递归学习起来不是一朝一夕的事情,等后面开始写递归专题的时候再来补充吧。毕竟对于递归,我还需要沉淀沉淀。(其实能写迭代,尽量不写递归,一般当使用迭代很麻烦时才考虑递归,毕竟递归会比迭代更难理解些,在我看来)。
4.提交结果:
5.读书分享:
《道德经·第三十八章》:
是以大丈夫处其厚,不居其薄;处其实,不居其华。
解释:所以,大丈夫,选择淳厚而不选择轻薄;选择朴实而不选择虚华。
希望我能静下心来,不浮躁,寻根究底,真正理解到一个问题的本质,而不是沉浸在自我的小小空间里。