📜  从链表中删除元音的程序(1)

📅  最后修改于: 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;
}
总结

本程序使用了哈希表来存储元音字母,大大提高了删除效率。通过虚拟头结点,可以避免删除头结点的特判。同时,使用智能指针可以有效地避免内存泄露问题,提供了代码的可读性。