【每天学习亿点点系列】——OJ203题:移除链表元素

【每天学习亿点点系列】——OJ203题:移除链表元素

  • 题目
  • 思路
  • 代码实现
  • 注意点
    • 1. 不要以为cur就是head节点
      • 反例
    • 2.特殊情况
      • 找第一个不为val节点时
      • 当nnext为空指针时,不能再对它访问了
    • 3.在你找第一个不为val的节点时要一起移动

题目

【每天学习亿点点系列】——OJ203题:移除链表元素_第1张图片

思路

有了前面顺序表和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节点

这是一开始的样子

【每天学习亿点点系列】——OJ203题:移除链表元素_第2张图片

反例

【每天学习亿点点系列】——OJ203题:移除链表元素_第3张图片

2.特殊情况

找第一个不为val节点时

【每天学习亿点点系列】——OJ203题:移除链表元素_第4张图片
【每天学习亿点点系列】——OJ203题:移除链表元素_第5张图片

当nnext为空指针时,不能再对它访问了

这些地方都是此处要注意的点

【每天学习亿点点系列】——OJ203题:移除链表元素_第6张图片
【每天学习亿点点系列】——OJ203题:移除链表元素_第7张图片
【每天学习亿点点系列】——OJ203题:移除链表元素_第8张图片

3.在你找第一个不为val的节点时要一起移动

【每天学习亿点点系列】——OJ203题:移除链表元素_第9张图片

最后附上自己写后画的一副图解(可能写的不是很详细)【每天学习亿点点系列】——OJ203题:移除链表元素_第10张图片

你可能感兴趣的:(每天学习亿点点系列,leetcode,链表,leetcode,数据结构,指针)