一个单链表中有 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;//最后返回头结点
}
};