用C++实现一个链表,包含一个操作:将两个链表取交集,使用增删改查基本操作来实现
时间: 2024-09-22 15:09:55 浏览: 47
基于C++实现两个有序链表序列的交集【100012664】
5星 · 资源好评率100%
在C++中实现链表并且计算两个链表的交集,我们可以先创建链表的基本结构,然后实现合并两个链表并找出它们的交集。以下是一个简化版的实现,假设链表节点包含整数值,并且仅考虑无环链表的情况:
```cpp
#include <unordered_set>
using namespace std;
// 链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 链表类,包含基础操作
class LinkedList {
private:
ListNode* head;
public:
LinkedList() : head(NULL) {}
// 添加节点
void addNode(int val) {
ListNode* newNode = new ListNode(val);
if (!head) {
head = newNode;
} else {
ListNode* curr = head;
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = newNode;
}
}
// 查找节点是否存在
bool contains(int val) {
ListNode* curr = head;
while (curr != NULL) {
if (curr->val == val) {
return true;
}
curr = curr->next;
}
return false;
}
// 删除节点
void removeNode(int val) {
if (!head) {
return;
}
if (head->val == val) {
ListNode* temp = head;
head = head->next;
delete temp;
return;
}
ListNode* curr = head;
while (curr->next != NULL && curr->next->val != val) {
curr = curr->next;
}
if (curr->next != NULL) {
ListNode* temp = curr->next;
curr->next = curr->next->next;
delete temp;
}
}
// 计算两个链表的交集
void intersect(const LinkedList& other) {
unordered_set<int> setThis(*this);
for (ListNode* node = other.head; node != nullptr; node = node->next) {
if (setThis.contains(node->val)) {
cout << "Intersection: " << node->val << endl;
// 你可以选择在这里添加或更新节点,具体取决于你的需求
// 这里仅输出结果
}
}
}
};
int main() {
LinkedList list1;
list1.addNode(1);
list1.addNode(2);
list1.addNode(3);
list1.addNode(4);
list1.addNode(5);
LinkedList list2;
list2.addNode(4);
list2.addNode(6);
list2.addNode(7);
list2.addNode(8);
list2.addNode(9);
// 添加交集操作
list1.intersect(list2);
return 0;
}
```
在这个例子中,`LinkedList`类包含了基本的操作如添加节点、查找节点、删除节点,以及计算两个链表的交集。计算交集的部分通过一个集合(`unordered_set`)来帮助快速查找元素。在实际应用中,你可能还需要根据需要修改`intersect`方法来执行增加或替换节点的操作。
阅读全文