📅  最后修改于: 2023-12-03 15:23:37.287000             🧑  作者: Mango
在链表数据结构中,删除指定节点的操作是经常需要实现的一项操作。但是,在某些情况下,可能会有特殊约束条件,需要在这个约束条件下实现删除操作。本文将演示如何在给定约束下删除链表中给定节点的 C++ 程序。
假设我们有一个链表,每个节点包含一个整数值和一个指向下一个节点的指针。我们希望从链表中删除一个指定节点,但要求不能删除最后一个节点。
我们可以通过重排链表节点的值和指针来实现节点的删除。首先,我们将要删除的节点的值和指针替换为下一个节点的值和指针。然后删除下一个节点,这样就相当于实现了删除指定节点的操作。
但是,如果要删除的节点恰巧是最后一个节点,那么上述方法就行不通了。因此,我们必须在这种情况下采取不同的方法。具体来说,我们可以遍历链表,找到倒数第二个节点,并将其指向 NULL,然后删除最后一个节点。
下面是一个示例实现,演示如何在给定约束下删除链表中给定节点的 C++ 程序。
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
void deleteNode(ListNode* node) {
// 判断给定节点是否为最后一个节点
if (node->next == nullptr) {
return;
}
ListNode* next = node->next;
// 将要删除的节点的值和指针替换为下一个节点的值和指针
node->val = next->val;
node->next = next->next;
// 删除下一个节点
delete next;
}
int main() {
// 创建链表
ListNode* head = new ListNode(1);
head->next = new ListNode(2);
head->next->next = new ListNode(3);
head->next->next->next = new ListNode(4);
head->next->next->next->next = new ListNode(5);
// 打印原始链表
cout << "Before delete: ";
ListNode* p = head;
while (p != nullptr) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
// 删除节点 3
deleteNode(head->next->next);
// 打印删除节点 3 后的链表
cout << "After delete: ";
p = head;
while (p != nullptr) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
// 删除最后一个节点
deleteNode(head->next->next->next->next);
// 打印删除最后一个节点后的链表
cout << "After delete last node: ";
p = head;
while (p != nullptr) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
return 0;
}
输出结果如下:
Before delete: 1 2 3 4 5
After delete: 1 2 4 5
After delete last node: 1 2 4
在上述代码中,我们首先创建一个链表,并将其打印出来,然后删除节点 3,并再次打印链表,最后删除最后一个节点,并再次打印链表。
本文演示了如何在给定约束下删除链表中给定节点的 C++ 程序。具体来说,我们通过重排节点的值和指针来实现删除操作,同时要注意特殊情况,如要删除的节点是最后一个节点的情况。如果你对链表数据结构还不熟悉,可以先了解链表的基本概念和操作。