【数据结构算法经典题目刨析(c语言)】移除链表元素(图文详解)

💓 博客主页:C-SDN花园GGbond

⏩ 文章专栏:数据结构经典题目刨析(c语言)

目录

一.题目描述

二.解题思路

1.删除原链表的指定元素

1.1图解 

1.2 代码实现 (c语言)

2.创建新链表 尾插不属于指定元素的节点

2.1代码实现(c语言) 


一.题目描述:

二.解题思路:

第一种方式 删除原链表的指定元素(双指针法)
第二种方式 :创建新链表 尾插不属于指定元素的节点(更为简洁高效

1.删除原链表的指定元素

解题步骤:

1.设置两个均指向头节点的指针,pre(记录待删除节点的前一节点)和 cur (记录当前节点);

2.遍历整个链表,查找节点值为 val 的节点,找到即删除该节点,否则继续查找。

   2.1 找到,将当前节点的前一节点(之前最近一个值不等于 val 的节点(pre))连接到当前节 点(cur)的下一个节点(即将 pre 的下一节点指向 cur 的下一节点:pre->next = cur->next)。

   2.2 没找到,更新最近一个值不等于 val 的节点(即 pre = cur),并继续遍历(cur = cur->next)。

1.1图解 :

还是以链表 1->2->6->3->4->5->6, val = 6 为例子,利用双指针进行删除操作如下:

 cur->val!=val时pre=cur;cur=cur->next;

cur->val ==val时pre-next=pcur->next; pcur=pcur->next

依次进行 :

1.2 代码实现 (c语言)
struct ListNode* removeElements(struct ListNode* head, int val) 
{
    while(head!=NULL&&head->val==val)//解决头节点为val的情况,并且防止了空指针解引用
    {
        head=head->next;
    }
     struct ListNode* cur = head;
    struct ListNode* pre = head;
    while (cur != NULL) 
    {
        if (cur->val == val) 
        {
            pre->next = cur->next;
        } 
        else 
        {
            pre = cur;
        }
        cur = cur->next;
    }
    return head;


}

2.创建新链表 尾插不属于指定元素的节点

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

2.1代码实现(c语言) 
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;
}

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值