前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【力扣】移除链表元素203

【力扣】移除链表元素203

作者头像
zxctscl
发布2024-01-23 08:31:54
850
发布2024-01-23 08:31:54
举报
文章被收录于专栏:zxctscl个人专栏zxctscl个人专栏

1.前言

这里开始介绍从网上一些刷题网站上的题目,在这里做一些分享,和学习记录。 先来介绍一些力扣的OJ题目。 这里的OJ就是我们不需要写主函数,力扣会提供一个接口,在力扣中会调用我们所写的代码和它后台的匹配,从而判断我们写的代码正确性。

在力扣的题目中一般会给一些示例,就像这样:

在这里插入图片描述
在这里插入图片描述

当我们写完代码时可以点击运行,这时下面会出现一些测试用例,就像下面这样:

在这里插入图片描述
在这里插入图片描述

但是并不是给了运行成功就一定能成功,必须点击上面的提交,通过了才是真正的正确,就像下面这样:

在这里插入图片描述
在这里插入图片描述

2. 题目描述

在这里插入图片描述
在这里插入图片描述

3. 题目分析

这里题目明确指出需要返回的是新的链表,所以要返回一个新链表的头节点。 当我们没有任何思路时,可以先看看它给的示例,先进行一下分析。

在这里插入图片描述
在这里插入图片描述

要找到不是val值的节点,那么首先肯定要先遍历原来的链表,把不是的插入到新的链表中。

那首先就得先定义一个新的链表的头指针struct ListNode* newhead=NULL;为了方便实现插入,使用尾插,再定义一个新链表的尾指针方便插入struct ListNode* tail=NULL;接下来就需要原链表中找出不是val值的节点,然后尾插就行。

怎么找出不是val值的节点? 为了不使原链表中的头节点丢失,用定义一个cur指针代替,struct ListNode* cur=head;。 用一个while循环,当cur为空时就结束,也就是cur已经把原链表遍历完了。

这里需要先考虑一下如果原链表为空,那就直接返回NULL就行。

在循环中怎么写找到val的代码? 那就先让cur往后走,当走到cur->val=val结束,所以这里插入的条件就是if(cur->val!=val),然后开始实现尾插。

3.1 不带哨兵位

这里还需要先判断一下新的链表是不是为空,如果为空,那就直接将cur=newhead,并且更新一下tail=cur;如果不为空,那就直接实现尾插。

代码语言:javascript
复制
        if(cur->val!=val)
        {
            if(newhead==NULL)
            {
                newhead=cur;
                tail=cur;
            }
            else
            {
                 tail->next=cur;
                 tail=tail->next;
            }

然后让cur继续往后遍历。 当找到原链表中节点值为val的节点是时,就删除:

代码语言:javascript
复制
struct ListNode* tmp=cur;
         cur=cur->next;
         free(tmp);

这里加一个尾指针的判断

代码语言:javascript
复制
if(tail)
    {
        tail->next=NULL;
    }

最后直接返回新节点的头指针。

在这里插入图片描述
在这里插入图片描述

3.2 带哨兵位

使用带哨兵位的新链表, newhead=tail=(struct ListNode*)malloc(sizeof(struct ListNode));就不需要判断新链表是否为空。 其它地方都与不带哨兵位一样,不过最后得把申请的哨兵位释放掉,返回的是哨兵位的后一个节点。

代码语言:javascript
复制
     struct ListNode* tmp=newhead;
     newhead=newhead->next;
     free(tmp);

    return newhead;  
在这里插入图片描述
在这里插入图片描述

4. 附代码

4.1 不带哨兵位

代码语言:javascript
复制
struct ListNode* removeElements(struct ListNode* head, int val) 
{
    struct ListNode* newhead=NULL;
    struct ListNode* tail=NULL;
    struct ListNode* cur=head;
    while(cur)
    {
        if(cur->val!=val)
        {
            if(newhead==NULL)
            {
                newhead=cur;
                tail=cur;
            }
            else
            {
                 tail->next=cur;
                 tail=tail->next;
            }
         cur=cur->next;
        }
        else{
         struct ListNode* tmp=cur;
         cur=cur->next;
         free(tmp);
        }
        
    }
    if(tail)
    {
        tail->next=NULL;
    }
    return newhead;    
}

4.2 带哨兵位

代码语言:javascript
复制
struct ListNode* removeElements(struct ListNode* head, int val) {
   
    struct ListNode* newhead=NULL;
    struct ListNode* tail=NULL;
    struct ListNode* cur=head;

    newhead=tail=(struct ListNode*)malloc(sizeof(struct ListNode));

    while(cur)
    {
        if(cur->val!=val)
        {
             tail->next=cur;
             tail=tail->next;
             cur=cur->next;
        }
        else{
         struct ListNode* tmp=cur;
         cur=cur->next;
         free(tmp);
        }
        
    }
     tail->next=NULL;
    
     struct ListNode* tmp=newhead;
     newhead=newhead->next;
     free(tmp);

    return newhead;   
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.前言
  • 2. 题目描述
  • 3. 题目分析
    • 3.1 不带哨兵位
      • 3.2 带哨兵位
      • 4. 附代码
        • 4.1 不带哨兵位
          • 4.2 带哨兵位
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档