3756. 筛选链表

一个单链表中有 m 个结点,每个结点上的元素的绝对值不超过 n。

现在,对于链表中元素的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。

请输出筛选后的新链表。

例如,单链表 21 -> -15 -> -15 -> -7 -> 15,在进行筛选和删除后,变为 21 -> -15 -> -7。

输入样例:

输入:21->-15->-15->-7->15
输出:21->-15->-7

数据范围
1≤m≤1000,
1≤n≤10000
[//]: # (打卡模板,上面预览按钮可以展示预览效果 ^^)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
 /*note:
 如何判断一个数是否出现过
 
 思路:用一个数组,第一个点保留,每次判断一下,下一个点是否要删
 
 */
class Solution {
public:
    ListNode* filterList(ListNode* head) {
        bool st[100001]={};//定义一个布尔型数组,像这种题判断一个数字是否重复出现,要么为真,要么为假,最好用bool 
        st[abs(head->val)]=true;//让第一个点的值为真
        for(auto p=head;p->next;)//p来循环
        {
            int x=abs(p->next->val);
            if(st[x])
            {
                auto q=p->next;//q为p的下一个节点,q再这里用来判断是否重复
                p->next=q->next;//如果重复,删除q
                delete q;
            }
            else
            {
                p=p->next;//如果不重复,p继续向后走
                st[x]=true;
            }
        }
        return head;//最后返回头结点
        
        
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值