📜  门| GATE CS Mock 2018 |第 65 题(1)

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

介绍

这是一道 GATE CS Mock 2018 的编程题,题目编号为第 65 题。该题目要求实现一个双向列表中删除第 n 个节点的函数。

背景

双向列表是一种常见的数据结构,每个节点拥有向前和向后两个指针。删除节点操作的实现需要仔细考虑前后节点指针的更新。

思路

删除第 n 个节点需要找到该节点,然后更新该节点前后节点的指针,最后将该节点从内存中释放即可。由于该题中是双向列表,因此需要注意前后节点指针的更新操作。

实现

以下是具体的代码实现。这里假设节点的定义为:

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

函数实现如下:

Node* deleteNode(Node* head, int n) {
    if (!head) return nullptr;
    Node* cur = head;
    for (int i = 1; i < n; ++i) {
        if (!cur->next) return head;
        cur = cur->next;
    }
    if (!cur->prev) {  // delete head
        Node* ret = head->next;
        ret->prev = nullptr;
        delete head;
        return ret;
    } else {
        cur->prev->next = cur->next;
        if (cur->next) cur->next->prev = cur->prev;
        delete cur;  
        return head;
    }
}

该函数的时间复杂度为 $O(n)$,其中 n 表示节点数目。该函数的空间复杂度为 $O(1)$,因为只需要常数个额外空间。