题目链接:
https://www.acwing.com/activity/content/problem/content/4300/
method1
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* filterList(ListNode* head) {
ListNode* dummy = new ListNode(0);//定义一个虚拟头结点
dummy->next = head;//虚拟头结点位于头结点前面
auto cur = dummy;//当前节点指向操作节点的前一个位置
unordered_map<int, int> cnt;//用哈希存储一下表中绝对值相等的元素的个数
while(cur->next != NULL){//遍历链表
cnt[abs(cur->next->val)]++;//统计绝对值相同元素的个数
if(cnt[abs(cur->next->val)] > 1){//如果绝对值相同的元素的个数大于1,只保留第一个出现的节点,其余删除
cur->next = cur->next->next;//删除多余节点
}else{//向后遍历
cur = cur->next;
}
}
return dummy->next;//返回链表的头结点
}
};
method2
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* filterList(ListNode* head) {
auto dummy = new ListNode(0);//定义一个虚拟头结点
dummy->next = head;//虚拟头结点加入链表
auto pre = dummy, p = head;//pre指向p的前一个位置,p指向当前处理的节点
unordered_map<int, int> cnt;//哈希表存储绝对值相同的元素的个数
while(p){//从第一个节点开始遍历
cnt[abs(p->val)]++;//统计绝对值相同元素的个数
if(cnt[abs(p->val)] > 1){//只保留绝对值相同且第一次出现的元素
pre->next = p->next;
p = p->next;
}else{//向后遍历
pre = pre->next;
p = p->next;
}
}
return dummy->next;//返回头结点
}
};
小结:
定义虚拟头结点的好处:
-
方便处理对于头结点进行操作的链表,操作统一化
-
方便返回头结点