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

Posted 变秃变强 呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天学习亿点点系列——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题:移除链表元素的主要内容,如果未能解决你的问题,请参考以下文章

每天学习亿点点系列——单链表OJ题

数据结构OJ题——移除链表元素

LeetCode - #203 移除链表元素

[LC]203题 Remove Linked List Elements (移除链表元素)(链表)

LeetCode Algorithm 203. 移除链表元素

LeetCode链表题总结(持续更新)