You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用指针与动态结构实现字符串特定子串删除功能?

用指针与动态链表实现删除字符串中特定子串

问题分析

你需要实现扫描输入字符串并删除所有连续的pe子串,但现有代码存在两个核心问题:

  1. 第一段STL list版本逻辑错误:通过i += 3截取子串的方式完全不符合需求,这是按固定间隔拆分字符串,而非扫描整个文本寻找pe。
  2. 第二段代码仅定义了空结构体和未完成的创建函数,缺少链表的核心逻辑实现。

下面是符合要求的**手动链表(指针+动态内存)**实现方案:

完整代码实现

#include <iostream>
#include <string>

using namespace std;

// 定义链表节点结构:存储单个字符 + 下一个节点指针
struct Node {
    char ch;
    Node* next;
    // 构造函数简化节点创建
    Node(char c) : ch(c), next(nullptr) {}
};

// 从输入字符串创建链表
Node* createLinkedList(const string& input) {
    if (input.empty()) return nullptr;

    Node* head = new Node(input[0]);
    Node* current = head;

    for (size_t i = 1; i < input.size(); ++i) {
        current->next = new Node(input[i]);
        current = current->next;
    }

    return head;
}

// 删除链表中所有连续的"pe"子串
void removePeSubstring(Node*& head) {
    if (!head || !head->next) return;

    Node dummy(0); // 哑节点,简化头节点删除的处理
    dummy.next = head;
    Node* prev = &dummy;

    while (prev->next && prev->next->next) {
        Node* first = prev->next;
        Node* second = first->next;

        // 检查当前两个节点是否是'p'和'e'
        if (first->ch == 'p' && second->ch == 'e') {
            // 删除这两个节点,释放内存
            prev->next = second->next;
            delete first;
            delete second;
            // 不需要移动prev,因为新的next可能还是"pe"
        } else {
            prev = prev->next;
        }
    }

    head = dummy.next; // 更新头节点
}

// 打印链表内容
void printLinkedList(Node* head) {
    Node* current = head;
    while (current) {
        cout << current->ch;
        current = current->next;
    }
    cout << endl;
}

// 释放链表内存,避免泄漏
void freeLinkedList(Node*& head) {
    Node* current = head;
    while (current) {
        Node* temp = current;
        current = current->next;
        delete temp;
    }
    head = nullptr;
}

int main() {
    string input;
    cout << "Enter your coded text: " << endl;
    getline(cin, input);

    Node* head = createLinkedList(input);
    removePeSubstring(head);
    printLinkedList(head);
    freeLinkedList(head);

    return 0;
}

代码说明

  1. 链表节点结构:Node结构体存储单个字符和下一个节点的指针,构造函数简化节点初始化。
  2. 链表创建:createLinkedList遍历输入字符串,逐个生成节点并链接成完整链表。
  3. 删除"pe"子串:
    • 使用**哑节点(dummy node)**避免处理头节点被删除的复杂情况。
    • 遍历链表时,检查当前节点和下一个节点是否为p和e,如果是则删除这两个节点并调整指针,同时释放内存。
    • 删除后不移动prev指针,因为新的后续节点可能仍组成pe。
  4. 内存管理:freeLinkedList遍历链表释放所有节点内存,避免内存泄漏。
  5. 输入处理:使用getline读取完整输入(包含空格),符合示例中的输入需求。

测试示例

输入:Hepello Ipe hapeve ape prpeobpelepem
输出:Hello I have a problem

内容的提问来源于stack exchange,提问作者Uncognito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:40:28