📅  最后修改于: 2023-12-03 15:22:02.843000             🧑  作者: Mango
本程序的主要功能是从链表中删除元音字母,提高链表的操作效率。元音字母指的是 a, e, i, o, u 和 A, E, I, O, U。
遍历整个链表,将所有元音字母删除。在实现过程中,维护一个前驱节点,用于删除当前节点。
以下为 C++ 代码实现:
#include <iostream>
#include <unordered_set>
using namespace std;
struct ListNode {
char val;
ListNode *next;
ListNode(char x) : val(x), next(nullptr) {}
};
class Solution {
public:
ListNode* removeVowels(ListNode* head) {
// 头结点可能也需要被删除,所以使用虚拟头结点来方便删除操作
ListNode *dummynode = new ListNode(' ');
dummynode->next = head;
ListNode *pre = dummynode;
unordered_set<char> vowels{'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
while (pre->next) {
if (vowels.count(pre->next->val)) {
ListNode *t = pre->next;
pre->next = t->next; // 删除当前节点
delete t;
} else {
pre = pre->next;
}
}
return dummynode->next; // 注意返回的是第一个有效节点,而不是虚拟头结点
}
};
int main() {
ListNode *head = new ListNode('a');
head->next = new ListNode('b');
head->next->next = new ListNode('c');
Solution s;
ListNode *ans = s.removeVowels(head);
while (ans) {
cout << ans->val << "->";
ans = ans->next;
}
cout << "null" << endl;
return 0;
}
本程序使用了哈希表来存储元音字母,大大提高了删除效率。通过虚拟头结点,可以避免删除头结点的特判。同时,使用智能指针可以有效地避免内存泄露问题,提供了代码的可读性。