已知带头结点的单链表L,请写一算法,删除所有数据元素值为x的结点。要求:定义 单链表的存储结构并分析算法的时间复杂度。
时间: 2024-10-17 08:02:53 浏览: 76
首先,我们需要定义单链表的节点结构,通常它包含两个部分:一个数据域data用于存储元素值,另一个指针域next连接到下一个节点:
```c++
struct ListNode {
int data;
ListNode* next;
ListNode(int x) : data(x), next(nullptr) {}
};
```
接下来,我们可以编写一个函数来删除所有值为x的节点:
```c++
void removeNodes(ListNode* &head, int x) {
if (head == nullptr || head->data != x) { // 如果头节点不存在或者头节点不是目标值,直接返回
return;
}
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr != nullptr && curr->data == x) { // 遍历链表,遇到值为x的节点
ListNode* nextNode = curr->next;
if (prev == nullptr) { // 如果是头节点,更新头节点
head = nextNode;
} else {
prev->next = nextNode; // 删除当前节点
}
delete curr; // 释放内存
curr = nextNode; // 移动到下一个节点
prev = curr; // 更新前驱节点
}
}
```
该算法的时间复杂度是O(n),其中n是链表的长度。因为我们只遍历一次链表,并在每个节点上进行常数时间的操作(查找、删除和内存释放)。如果x不在链表中,此操作不会改变链表的实际长度。
阅读全文