【LeetCode】移除链表元素(C语言)| 图解算法,超详细哦~

news/2025/2/22 13:40:04

文章目录

    • (1)题目描述
    • (2)解题思路
      • 1)思路1:找到等于 val 的节点直接删除
      • 2)思路2:将不等于 val 的节点尾插到一个新链表

《题目难度:简单》

(1)题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

示例1:

img

输入:head = [1, 2, 6, 3, 4, 5, 6],val = 6

输出:[1, 2, 3, 4, 5]

示例2:

输入:head = [ ],val = 1

输出:[ ]

示例3:

输入:head = [7, 7, 7, 7], val = 7

输出:[ ]

LeetCode链接:203. 移除链表元素


(2)解题思路

1)思路1:找到等于 val 的节点直接删除

  • 定义一个指针 cur,用来遍历链表,找到等于 val 的节点

  • 定义一个指针 prev,保存 cur 的上一个节点的位置

  • 定义一个指针 next,保存 cur 的下一个节点的位置,用来迭代

  • 首先判断 cur 指向节点的值是否等于 val:

  • 如果等于,则要删除这个节点。我们需要将 prev->next 指向 next 指针,然后 free(cur),再将 cur 往前移动到 next 指针的位置,这样就完成对这个节点的删除啦

image-20210830204816063
  • 如果不等于,只需要将 prev 指针和 cur 指针往前移动一位即可,继续遍历链表寻找等于 val 的节点
  • 最后返回头节点指针 head 即可
  • 需要考虑这一点

如果要删除的节点是头节点,所以在删除的时候需要额外判断一下是不是头结点

image-20210830210523275
  • 代码如下
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* removeElements(struct ListNode* head, int val){
    //解题思路:遍历链表,找到满足Node.val == val的节点
    struct ListNode* cur = head;
    struct ListNode* prev = head;  //保存cur的上一个节点位置
    while(cur != NULL)  //遍历链表
    {
        if(cur->val == val)  //找到等于val的节点
        {
            struct ListNode* next = cur->next;  //保存cur的下一个节点位置
            if(head == cur)  //判断cur是否是头节点
            {
                head = next;
            }
            else
            {
                prev->next = next;  //将cur上一个节点和cur下一个节点相连
            }
            free(cur);  //删除等于val的节点
            cur = next;
        }
        else if(cur->val != val)
        {
            prev = cur;
            cur = prev->next; 
        }
    }
    return head;
}

2)思路2:将不等于 val 的节点尾插到一个新链表

  • 链表中所有不等于 val 的节点尾插到一个新链表中,相当于删除了等于val的节点
  • 定义一个指针 cur,用来遍历原链表,找到不等于 val 的节点
  • 定义一个指针 newhead,指向新链表的头节点
  • 定义一个指针 tail,保存新链表尾节点的位置
image-20210830211433874
  • 首先判断 cur 指向节点的值是否不等于 val:

  • 如果不等于,则需要将其尾插到新链表中,首次尾插时,新链表为空,我们让 newhead 指向 cur,然后让 tail 指向 cur,更新新链表的尾节点,cur 往后移动一位,指向待遍历的下一个节点,最后将尾节点的 next 指针置空。

image-20210830213802614
  • 如果等于,则要删除这个节点。定义一个指针 next 保存 cur 的下一个节点的位置,然后 free(cur),再将 cur 移动到 next 的位置,继续遍历原链表
  • 最后返回新链表的头节点指针 newhead 即可
  • 代码如下
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* removeElements(struct ListNode* head, int val){
    //解题思路:把链表中所有不等于val的节点尾插到一个新链表中,相当于删除了等于val的节点
    struct ListNode* newhead = NULL;  //新链表初始为空
    struct ListNode* tail = newhead;  //记录新链表尾节点的位置
    struct ListNode* cur = head;
    while(cur != NULL)
    {
        if(cur->val != val)  //把链表中所有不等于val的节点尾插到一个新链表
        {
            if(newhead == NULL)  //新链表为空时
            {
                newhead = cur;
            }
            else  //新链表不为空时
            {
                tail->next = cur;
            }
            tail = cur;  //更新尾节点
            cur = cur->next;  //cur指向原链表中的下一个节点
            tail->next = NULL;  //将尾节点置空
        }
        else if(cur->val == val)
        {
            struct ListNode* next = cur->next;  //保存cur的下一个节点位置
            free(cur);  //删除等于val的节点
            cur = next;
        }
    }
    return newhead;
}

大家快去动手练习一下吧!


http://www.niftyadmin.cn/n/1579730.html

相关文章

多媒体开发之视频播放概述

视频播放的数据基本流程 video track --------------- frame -------------- --------------->| Video Decoder |------------->| Video Output | …

【LeetCode】反转链表(C语言)| 动图演示,超详细哦~

文章目录(1)题目描述(2)解题思路1)解法1:调整节点指针的方向2)解法2:头插法题目难度:《简单》(1)题目描述 给你单链表的头节点 head ,…

计算PHP 往前往后推几天日期

2019独角兽企业重金招聘Python工程师标准>>> <?php date_default_timezone_set(PRC); //默认时区 echo "今天:",date("Y-m-d",time()),"<br>"; echo "今天:",date("Y-m-d",strtotime("18 june…

【数据结构入门】带头双向循环链表(List)详解(定义、增、删、查、改) | 配有大量图解,超详细哦~

文章目录&#xff08;1&#xff09;前言&#xff08;2&#xff09;带头双向循环链表的实现1&#xff09;双向链表的定义2&#xff09;双向链表的初始化3&#xff09;双向链表的销毁4&#xff09;打印双向链表5&#xff09;双向链表的尾插6&#xff09;双向链表的尾删7&#xff…

【数据结构入门】顺序表和链表的区别,以及啥是缓存利用率

文章目录&#xff08;1&#xff09;顺序表和链表的区别&#xff08;2&#xff09;缓存利用率1&#xff09;存储器层次结构2&#xff09;CPU和寄存器、高速缓存&#xff0c;以及主存之间的关系3&#xff09;缓存利用率&#xff08;1&#xff09;顺序表和链表的区别 链表和顺序表…

linux面试题(简答题部分)

linux面试题&#xff08;简答题部分&#xff09;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />简述进程的启动、终止的方式以及如何查看进程&#xff1f;答&#xff1a;启动进程的方式分为手动启动和自动启动两种方式&#xf…

【数据结构入门】栈(Stack)的实现(定义、销毁、入栈、出栈等) | 图解数据结构,超详细哦~

文章目录&#xff08;1&#xff09;前言1&#xff09;栈的概念2&#xff09;进栈出栈的形式3&#xff09;栈的存储结构&#xff08;2&#xff09;栈的实现&#xff08;顺序栈&#xff09;1&#xff09;栈的定义2&#xff09;栈的初始化3&#xff09;栈的销毁4&#xff09;入栈5…

转载-一位资深程序员的程序人生总结十三条

展望未来&#xff0c;总结过去10年的程序员生涯&#xff0c;给程序员小弟弟们的一些总结性忠告&#xff0c;走过的路&#xff0c;回忆起来是那么曲折&#xff0c;把自己的一些心得体会分享给程序员兄弟姐妹们&#xff0c;虽然时代在变化&#xff0c;但是很可能你也会走我已经做…