在单链表中存储了 m 个整数,每个节点由两部分组成:[data][link],其中 data 是整数,且满足 |data| < n(n 为正整数)。
现要求设计一个高效的算法来处理链表中 data 绝对值相等的节点,只保留首次出现的节点,删除其余绝对值相等的节点。
例如,对于以下链表:
1 -> 2 -> -2 -> 3 -> null
经过处理后,得到的链表为:
1 -> 2 -> 3 -> null
解题思路
本题的关键在于高效去重,即在链表中保留首次出现的数值对应的节点,而删除其他绝对值相等的节点。可以借助 哈希表(unordered_set) 来记录已经出现过的节点绝对值。这样,我们可以在遍历链表的同时,实时判断是否存在绝对值重复的节点。
具体思路如下:
- 从链表头开始遍历,使用一个哈希表
sets来记录出现过的节点绝对值。 - 如果当前节点的绝对值没有出现在
sets中,则将该节点的绝对值插入sets,并继续遍历。 - 如果当前节点的绝对值已经出现在
sets中,说明该节点为重复节点,删除该节点并更新链表结构。 - 最后得到一个不含重复绝对值节点的链表。
代码实现
数据结构定义
首先定义链表节点的数据结构:
struct Node {
int value; // 节点的数值
Node* next; // 指向下一个节点的指针
};
算法实现
按照上述思路,以下是完整的 C++ 代码实现:
#include <bits/stdc++.h>
using namespace std;
// 链表节点结构
struct Node {
int value;
Node* next;
};
// 去除链表中绝对值相同的节点,仅保留首次出现的节点
{
unordered_set<> sets;
Node* prev = node;
(node != ){
(sets.((node->value)) == sets.()){
sets.((node->value));
prev = node;
node = node->next;
} {
prev->next = node->next;
Node* n = node;
node = node->next;
(n);
}
}
}


