📅  最后修改于: 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)$,因为只需要常数个额外空间。