C++ 算法设计:删除单链表中指定范围的元素

问题描述: 已知单链表中各结点的元素值为整型且递增有序,设计算法删除链表中大于'mink'且小于'maxk'的所有元素,并释放被删结点的存储空间,给出算法伪代码和源代码。

算法伪代码如下:

  1. 创建指针变量'prev'和'curr',分别指向链表的头结点和第一个结点。
  2. 遍历链表,当'curr'不为空时执行以下步骤: 3. 如果'curr'的元素值大于'mink'且小于'maxk',则删除'curr'结点,并释放其存储空间。 4. 否则,将'prev'指向'curr',将'curr'指向下一个结点。
  3. 返回链表的头结点。

源代码如下:

#include <iostream>

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

ListNode* deleteElements(ListNode* head, int mink, int maxk) {
    ListNode* prev = nullptr;
    ListNode* curr = head;

    while (curr != nullptr) {
        if (curr->val > mink && curr->val < maxk) {
            ListNode* temp = curr;
            if (prev == nullptr) {
                head = curr->next;
            } else {
                prev->next = curr->next;
            }
            curr = curr->next;
            delete temp;
        } else {
            prev = curr;
            curr = curr->next;
        }
    }

    return head;
}

void printList(ListNode* head) {
    ListNode* curr = head;
    while (curr != nullptr) {
        std::cout << curr->val << " ";
        curr = curr->next;
    }
    std::cout << std::endl;
}

int main() {
    ListNode* head = new ListNode(1);
    ListNode* node1 = new ListNode(2);
    ListNode* node2 = new ListNode(3);
    ListNode* node3 = new ListNode(4);
    ListNode* node4 = new ListNode(5);

    head->next = node1;
    node1->next = node2;
    node2->next = node3;
    node3->next = node4;

    std::cout << "Original list: ";
    printList(head);

    int mink = 2;
    int maxk = 4;
    head = deleteElements(head, mink, maxk);

    std::cout << "Modified list: ";
    printList(head);

    return 0;
}

代码解释:

该代码创建了一个单链表,并实现了删除大于'mink'且小于'maxk'的元素的功能。在示例中,原始链表为1->2->3->4->5,删除大于2且小于4的元素后,修改后的链表为1->4->5。

总结:

本算法提供了一种有效的方式,可以从递增有序的单链表中删除指定范围内的元素,并释放被删除结点的内存空间。该算法易于理解和实现,在实际应用中具有较高的实用价值。

C++ 算法设计:删除单链表中指定范围的元素

原文地址: https://www.cveoy.top/t/topic/pbNn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录