【数据结构与算法】移除链表元素

举报
倔强的石头_ 发表于 2025/09/05 21:25:18 2025/09/05
【摘要】 想要移除链表的指定元素,有两种方式 第一种方式 :删除原链表的指定元素 第二种方式 :创建新链表 尾插不属于指定元素的节点


目录

一、问题描述

二、解题思路

三、源代码实现



一、问题描述


二、解题思路

第一种方式 :删除原链表的指定元素
第二种方式创建新链表 尾插不属于指定元素的节点

 这里只介绍第二种方式,因为更为简洁高效

  1.  首先创建新链表的首节点和尾节点指针 以及遍历原链表的pcur指针
  2. while循环,当pcur不为空时
          判断该元素是否不等于要删除的元素
                如果不是,进一步判断
                     若为空链表,首尾指针都指向新节点
                     若为非空链表,尾指针next指向该节点,尾指针向后移动

         pcur向后移动
  3. 出循环时,表明链表遍历完成 或未进入循环(原链表为空的情况)
            如果尾指针不为空的话,将尾指针的next指向空(这种情况对应的是原链表尾节点是需          要删除元素的情况,这种情况需要手动置空)
    对尾指针判空是防止对空链表的尾指针解引用
  4. 最后返回新链表首节点

三、源代码实现

struct ListNode {
    int val;
    struct ListNode* next;
};
struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* newhead, * newtail;//创建新链表的头指针尾指针
    newhead = newtail = NULL;//初始化
    struct ListNode* pcur = head;//遍历原链表的指针
    while (pcur)
    {
        if (pcur->val != val)//先判断是否是要删除的要素
        {
            if (newhead == NULL)//如果不是要删除的元素,并且新链表为空
            {
                newhead = newtail = pcur;//新链表首尾指针都指向该节点
            }
            else
            {
                newtail->next = pcur;//将该节点插入到新链表
                newtail = newtail->next;
            }
        }
        pcur = pcur->next;//pcur向后移动
    }
    if (newtail)//先判空是为了保证不是空链表
    {
        newtail->next = NULL;//将尾节点next指针指向NULL
    }
    return newhead;
}

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。