前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【数据结构与算法 刷题系列】移除链表元素

【数据结构与算法 刷题系列】移除链表元素

作者头像
用户11396077
发布2024-12-06 18:57:07
发布2024-12-06 18:57:07
5800
代码可运行
举报
文章被收录于专栏:C/C++指南C/C++指南
运行总次数:0
代码可运行

一、问题描述

二、解题思路

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

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

  1. 首先创建新链表的首节点和尾节点指针 以及遍历原链表的pcur指针
  2. while循环,当pcur不为空时 判断该元素是否不等于要删除的元素 如果不是,进一步判断 若为空链表,首尾指针都指向新节点 若为非空链表,尾指针next指向该节点,尾指针向后移动 pcur向后移动
  3. 出循环时,表明链表遍历完成 或未进入循环(原链表为空的情况) 如果尾指针不为空的话,将尾指针的next指向空(这种情况对应的是原链表尾节点是需 要删除元素的情况,这种情况需要手动置空) 而对尾指针判空是防止对空链表的尾指针解引用
  4. 最后返回新链表首节点

三、源代码实现

代码语言:javascript
代码运行次数:0
复制
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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题描述
  • 二、解题思路
  • 三、源代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档