有了前面顺序表和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;
}
这是一开始的样子
这些地方都是此处要注意的点