📌  相关文章
📜  在给定约束下删除链表中给定节点的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:23:37.287000             🧑  作者: Mango

在给定约束下删除链表中给定节点的 C++ 程序

在链表数据结构中,删除指定节点的操作是经常需要实现的一项操作。但是,在某些情况下,可能会有特殊约束条件,需要在这个约束条件下实现删除操作。本文将演示如何在给定约束下删除链表中给定节点的 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++ 程序。具体来说,我们通过重排节点的值和指针来实现删除操作,同时要注意特殊情况,如要删除的节点是最后一个节点的情况。如果你对链表数据结构还不熟悉,可以先了解链表的基本概念和操作。