C++ 算法设计:删除单链表中指定范围的元素
C++ 算法设计:删除单链表中指定范围的元素
问题描述: 已知单链表中各结点的元素值为整型且递增有序,设计算法删除链表中大于'mink'且小于'maxk'的所有元素,并释放被删结点的存储空间,给出算法伪代码和源代码。
算法伪代码如下:
- 创建指针变量'prev'和'curr',分别指向链表的头结点和第一个结点。
- 遍历链表,当'curr'不为空时执行以下步骤: 3. 如果'curr'的元素值大于'mink'且小于'maxk',则删除'curr'结点,并释放其存储空间。 4. 否则,将'prev'指向'curr',将'curr'指向下一个结点。
- 返回链表的头结点。
源代码如下:
#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。
总结:
本算法提供了一种有效的方式,可以从递增有序的单链表中删除指定范围内的元素,并释放被删除结点的内存空间。该算法易于理解和实现,在实际应用中具有较高的实用价值。
原文地址: https://www.cveoy.top/t/topic/pbNn 著作权归作者所有。请勿转载和采集!