每天学习亿点点系列——OJ203题:移除链表元素
Posted 变秃变强 呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天学习亿点点系列——OJ203题:移除链表元素相关的知识,希望对你有一定的参考价值。
💥【每天学习亿点点系列】——OJ203题:移除链表元素
题目
思路
有了前面顺序表和oj题的练习,像这种题一看
三指针一定可以解决。我们用三个指针:pre记录当前位置的前一个位置的,以便删除当前位置后重新连起来链表;cur记录当前位置,判断是否为val的值,是则删除节点,不是则往后移动(一起往后移动);nnext(为了不与结构体类型里面的next重名,故取名为nnext)方便移动时找到当前位置的下一个位置
代码实现
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* cur=head;
struct ListNode* pre=NULL;
if(cur==NULL)
{
return NULL;
}
struct ListNode* nnext=cur->next;
//找到第一个不为val的位置,,那么那个位置一定是头
while(cur)
{
if(cur->val!=val)
{
break;
}
else
{
pre=cur;
cur=cur->next;
if(nnext!=NULL)
nnext=nnext->next;
}
}
if(cur==NULL)
{
return NULL; //这时说明全为val,则返回空
}
head=cur;
while(cur!=NULL)
{
if(cur->val!=val)
{
pre=cur;
cur=nnext;
if(nnext!=NULL)
{
nnext=nnext->next;
}
}
else
{
free(cur);
pre->next=nnext;
cur=nnext;
if(nnext!=NULL)
{
nnext=nnext->next;
}
}
}
return head;
}
注意点
1. 不要以为cur就是head节点
这是一开始的样子
反例
2.特殊情况
找第一个不为val节点时
当nnext为空指针时,不能再对它访问了
这些地方都是此处要注意的点
3.在你找第一个不为val的节点时要一起移动
最后附上自己写后画的一副图解(可能写的不是很详细)
以上是关于每天学习亿点点系列——OJ203题:移除链表元素的主要内容,如果未能解决你的问题,请参考以下文章
[LC]203题 Remove Linked List Elements (移除链表元素)(链表)