请用C++编程,描述 有一个非空整数单链表L,设计一个算法删除值重复的节点,多个值相同的节点仅保留第一个。 输入 8 1 4 1 2 2 1 3 4 输出 1 4 2 3 样例输入 8 1 4 1 2 2 1 3 4 样例输出 1 4 2 3
时间: 2024-09-29 22:15:01 浏览: 31
为了在C++中实现这个功能,我们可以遍历整个链表,并使用一个哈希集合来跟踪已经遇到的值。当遍历到重复的值时,我们只保留第一次遇到的那个节点,然后跳过后面的重复节点。以下是完整的代码实现:
```cpp
#include <iostream>
#include <unordered_set>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* removeDuplicates(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
std::unordered_set<int> seen;
ListNode* prev = nullptr, *current = head;
while (current != nullptr) {
if (seen.find(current->val) != seen.end()) {
prev->next = current->next;
} else {
seen.insert(current->val);
prev = current;
}
current = current->next;
}
return head;
}
void printList(ListNode* head) {
while (head != nullptr) {
std::cout << head->val << " ";
head = head->next;
}
std::cout << "\n";
}
int main() {
// 创建链表示例
ListNode* nodes = new ListNode(8); // 假设头结点已创建
nodes->next = new ListNode(1);
nodes->next->next = new ListNode(4);
nodes->next->next->next = new ListNode(1);
nodes->next->next->next->next = new ListNode(2);
nodes->next->next->next->next->next = new ListNode(2);
nodes->next->next->next->next->next = new ListNode(1);
nodes->next->next->next->next->next->next = new ListNode(3);
nodes->next->next->next->next->next->next = new ListNode(4);
// 删除重复节点并打印结果
ListNode* result = removeDuplicates(nodes);
printList(result);
// 示例输出: 1 4 2 3
delete nodes; // 手动释放内存,因为这里假设是动态分配的
return 0;
}
```
在这个代码中,`removeDuplicates`函数负责处理重复节点,而`printList`用于展示链表内容。`main`函数中构造了一个例子链表,然后调用这两个函数。注意,实际应用中应考虑链表可能会非常大,所以手动管理内存分配和释放是很重要的。
阅读全文