📅  最后修改于: 2023-12-03 14:54:56.913000             🧑  作者: Mango
链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表的插入、删除操作比数组更加高效,但在访问某个节点时需要遍历整个链表。
问题8:给定链表的头节点和一个要删除的节点,要求在O(1)时间内删除该节点。假设要删除的节点一定在链表中。
在单向链表中,要删除一个节点,需要先找到该节点的前一个节点,然后将前一个节点的指针指向要删除节点的下一个节点。但这样的时间复杂度是O(n),不符合要求。
为了在O(1)时间内删除节点,可以将要删除节点的下一个节点的数据复制到要删除节点中,然后将要删除节点的指针指向下下个节点。
具体实现步骤如下:
以下是Java代码实现:
public void deleteNode(ListNode node) {
if (node == null) return;
if (node.next == null) {
node = null;
return;
}
ListNode next = node.next;
node.val = next.val;
node.next = next.next;
}
其中ListNode是链表节点的定义:
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
本题利用链表节点的特点,通过将要删除节点的指针指向下下个节点,实现了O(1)时间删除节点的功能。但需要注意的是,在删除尾节点时需要先找到该节点的前一个节点。