当前位置: 首页 > article >正文

LeetCode每日精进:203.移除链表元素

题目链接:203.移除链表元素

题目描述:

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

示例 1:

输入: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
输出:[]

提示:

  • 列表中的节点数目在范围 [0, 104] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

思路一:查找结点值为val的结点位置,删除pos位置的结点

ListNode* pcur = head;

        定义pcur用来遍历链表。

        若当前结点值为val时:

if (pcur == head)
{
    //当前结点为头结点
    head = pcur->next;
    free(pcur);
}

        pcur为头结点,让头结点指向当前结点的下一个结点,释放pcur。

else{
    //当前结点不为头结点
    ListNode* prev = head;
    while(prev->next != pcur)
    {
        prev = prev->next;
    }
    prev->next = pcur->next;
    free(pcur);
}

        pcur不为头结点,找到pcur的前驱结点prev,并将前驱结点prev和后置结点pcur->连接,释放pcur。

完整代码:

 typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
    ListNode* pcur = head;
    while(pcur)
    {
        ListNode* next = pcur->next;
        if (pcur->val == val)
        {           
            if (pcur == head)
            {
                //当前结点为头结点
                head = pcur->next;
                free(pcur);
            }
            else{
                //当前结点不为头结点
                ListNode* prev = head;
                while(prev->next != pcur)
                {
                    prev = prev->next;
                }
                prev->next = pcur->next;
                free(pcur);
            }
        }
        pcur = next;
    }
    return head;
}

        时间复杂度O(n^2)

思路二:创建新链表,将结点值不为val的结点尾插到新链表中

ListNode* newHead = NULL;
ListNode* newTail = NULL;

        创建新链表,newTail指向新链表尾部,newHead指向新链表头部。

while(pcur)
{
    if (pcur->val != val)
    {
        if (newHead == NULL)
        {
            newHead = newTail = pcur;
        }
        else{
            newTail->next = pcur;
            newTail = newTail->next;
        }
    }
    pcur = pcur->next;
}

        若当前结点值不为val:

        1.新链表为空,将头结点和尾结点都指向pcur

        2.新链表不为空,将尾结点的next指针指向pcur,并将尾结点移向后一个结点

if (newTail)
{
    newTail->next = NULL;
}

        跳出循环后,再将尾结点的next指针置空,否则可能会输出原链表中该结点之后的结点值为val的结点。

完整代码:

 typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
    ListNode* newHead = NULL;
    ListNode* newTail = NULL;
    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;
    }
    if (newTail)
    {
        newTail->next = NULL;
    }
    return newHead;
}

        时间复杂度O(n)   


http://www.kler.cn/a/548791.html

相关文章:

  • 开发中需要使用到volatile的情况
  • 【大模型系列】入门常识备忘
  • IT行业方向细分,如何做到专家水平——7.边缘计算与物联网(IoT)
  • 算法刷题--哈希表--字母异位词和两个数组的交集
  • 从短片到长片:王琦携《Mountain》续作迈向新高度
  • Python进制转换
  • 智能设备监控:AI 与 Python 助力设备管理的未来
  • Substance Painter快捷键
  • 【AJAX】项目——数据管理平台
  • LabVIEW的吞雨测控系统
  • 【鸿蒙】ArkUI-X跨平台问题集锦
  • 虚拟机安装k8s集群
  • RFID技术在制造环节的应用与价值
  • 中缀表达式转后缀表达式(逆波兰表达式)并进行计算
  • Transformer 模型介绍(四)——编码器 Encoder 和解码器 Decoder
  • redis cluster测试
  • 基于Istio Ambient Mesh的无边车架构:实现零侵入式服务网格的云原生革命
  • Android remount failed: Permission denied 失败解决方法
  • 【前端框架】Vue 3组件生命周期钩子的使用场景
  • 3.5 企业级AI Agent运维体系构建:从容器化部署到智能监控的工业级实践指南