写一算法将单链表中值重复的结点删除,使所得 的结果链表中所有结点的值均不相同。用c++
时间: 2024-09-21 21:01:17 浏览: 75
删除单链表中值相同的多余结点-算法与数据结构--张乃孝-前三章习题课
这是一个经典的链表问题,通常通过遍历链表并在查找过程中记录元素是否已见过来解决。以下是使用C++实现的一个简单算法:
```cpp
#include <unordered_set>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* deleteDuplicates(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
std::unordered_set<int> seenValues;
ListNode* current = head;
while (current != nullptr) {
if (seenValues.find(current->val) != seenValues.end()) {
// 如果当前节点的值已经在集合中,删除该节点
ListNode* temp = current;
current = current->next;
delete temp;
} else {
// 否则,将值添加到集合并继续遍历
seenValues.insert(current->val);
current = current->next;
}
}
return head;
}
```
这个算法的工作原理是:
1. 定义一个哈希集合`seenValues`来保存已经遇到过的值。
2. 从头节点开始遍历链表。
3. 对于每个节点,如果它的值已经在集合中,就删除该节点,并跳过下一个节点。
4. 如果值不在集合中,将其加入集合并移动到下一个节点。
5. 遍历完成后返回头节点,得到的新链表中就不会有重复值了。
阅读全文