用c++编写:假设链表中结点的值为非递减,编写函数cl_unique(chainList h),删除h中值相同的结点(只保留一个)。
时间: 2024-10-12 11:17:24 浏览: 9
要实现这个功能,你可以使用C++中的迭代器和链表节点。这里是一个简单的示例,展示了如何遍历链表并删除所有重复的元素,保持链表的顺序不变:
```cpp
#include <iostream>
// 链表节点定义
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 删除链表中值相同的节点
ListNode* cl_unique(ListNode* h) {
if (h == nullptr || h->next == nullptr) {
return h;
}
// 使用两个指针,p指向当前节点,q指向下一个潜在的重复节点
ListNode* p = h, *q = h->next;
while (q != nullptr) {
// 如果找到重复值,则跳过q
if (p->val == q->val) {
ListNode* temp = q;
q = q->next;
delete temp; // 删除重复节点
} else {
// 没有重复,移动到下一个可能的重复节点
p = q;
q = q->next;
}
}
return h;
}
int main() {
// 创建一个简单的链表示例
ListNode* head = new ListNode(1);
head->next = new ListNode(2);
head->next->next = new ListNode(2);
head->next->next->next = new ListNode(3);
head->next->next->next->next = new ListNode(3);
head->next->next->next->next->next = new ListNode(4);
// 删除重复元素后打印链表
ListNode* unique_head = cl_unique(head);
while (unique_head != nullptr) {
std::cout << unique_head->val << " -> ";
unique_head = unique_head->next;
}
std::cout << "nullptr\n";
// 注意处理内存管理,特别是当链表节点动态分配时
delete unique_head;
return 0;
}
```
在这个例子中,`cl_unique` 函数接收链表头节点 `h` 作为参数,然后遍历链表,如果遇到重复的值,则删除该节点。最后返回修改后的链表头。
阅读全文