首页 > 其他分享 >LeetCode 题解 2487. 从链表中移除节点

LeetCode 题解 2487. 从链表中移除节点

时间:2022-12-15 13:57:05浏览次数:63  
标签:head struct val 题解 bucket 链表 num 移除 ptr

2487. 从链表中移除节点 - 力扣(Leetcode)

题解

思路一:递归逆序

struct ListNode* removeNodes(struct ListNode* head){
    if(head->next == NULL)//遍历到链表末尾
        return head;
    struct ListNode* after = removeNodes(head->next);
    if(after->val > head->val) return after;//如果after比head的数值更大,销毁head,返回after
    head->next = after;//否则此时为降序,将after链接在head之后
    return head;//返回after
}

思路二:暴力链表数组排序

struct Bucket_node {
    int num;
    int val;
    struct ListNode* address;
};
int cmp(const void* e1, const void* e2)
{
    struct Bucket_node a1 = *((struct Bucket_node*)e1), a2 = *((struct Bucket_node*)e2);
    if(a1.val != a2.val)
        return a2.val - a1.val;//先按数值降序排序
    else
        return a1.num - a2.num;//再按先后顺序升序排序
}

struct ListNode* removeNodes(struct ListNode* head){
    struct Bucket_node bucket[100000];//将链表转存为结构体数组,便于排序
    struct ListNode* ptr = head;
    int total = 0;
    while(ptr)//遍历链表所有节点
    {
        bucket[total].num = total;//保存顺序
        bucket[total].val = ptr->val;//保存数值
        bucket[total].address = ptr;//保存节点地址
        total++;
        ptr = ptr->next;
    }
    qsort(bucket, total, sizeof(struct Bucket_node), cmp);//按照val和num的结构体二级排序
    head = bucket[0].address;//将数值最大且位置最左的地址作为头节点
    ptr = bucket[0].address;
    int ptr_num = bucket[0].num;
    for(int i = 1; i < total; i++)
    {
        if(bucket[i].num > ptr_num)//如果在当前节点右侧
        {
            ptr->next = bucket[i].address;//链接下级节点
            ptr_num = bucket[i].num;//保存当前位置,用于比较左右顺序
            ptr = ptr->next;
        }
    }
    return head;
}

标签:head,struct,val,题解,bucket,链表,num,移除,ptr
From: https://www.cnblogs.com/fjnhyzCYL/p/16984835.html

相关文章

  • 问题解决系列:IDEA引入@Slf4j使用log变量,编译之后报log cannot be resolved
    问题场景IDEA引入@Slf4j使用log变量,编译之后报logcannotberesolved。本篇博客主要是针对此种情况进行解决。问题环境软件版本JDK1.8问题原因主要会有以下几方面的问题:未......
  • VNC常用操作及常见问题解决办法汇总
     VNC登录用户缺省是root,但在安装oracle时必须用oracle用户的身份登录,下面我们就以oracle为例说明如何配置VNC,从而可以使用不同的用户登录到主机。步骤描述如下:   步骤......
  • NOIP 2022 题解(个人)
    \(T1\)种花可以维护每一个点向下最多延伸多长\(xia_i\),向右延伸最多多长\(you_i\),这样C就好求了,可以维护\(you_i\)一个自下而上的后缀和。至于F就维护一个\(x......
  • 链表中环的入口结点
    给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出null。/***Definitionforsingly-linkedlist.*structListNode{*intval;*......
  • 反转链表
    定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。/***Definitionforsingly-linkedlist.*structListNode{*intval;*Lis......
  • 合并两个排序的链表
    输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。classSolution{public:ListNode*merge(ListNode*l1,ListNode*l2){......
  • java.security.NoSuchAlgorithmException:Cannot find any provider supporting AES/C
    由于小程序开发的需求,需要在后台对微信接口返回的敏感信息加密数据进行解密,以便开发使用,但是,在解密时出现以下异常:java.security.NoSuchAlgorithmException:Cannotfindan......
  • #24. 两两交换链表中的节点
    给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。1classSolution{2public:3List......
  • 206. 反转链表
    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 1structListNode{2intval;3ListNode*next;4ListNode():val(0),next(null......
  • 中国计量大学第六届个人校赛题解
    中国计量大学第六届个人校赛题解这里是一篇关于中国计量大学第六届个人校赛的题解。顺便写一点校赛的经历和想法,稍微给这次参与校赛组织的经历留下一点回忆C题配图的候......