题目:
给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点定义如下:
public class ListNode {
public int val;
public ListNode next;
}
分析:
有三种情况:
- 要删除的节点不是尾节点,时间复杂度为O(1)。
- 单链表中只有一个节点,删除头节点,时间复杂度为O(1)。
- 单链表中有多个节点,要删除的为尾节点,时间复杂度为O(n)。
针对第一种情况,采用如下步骤进行删除。
- 找到该节点的下一个节点。
- 将下一个节点的值赋给该节点。
- 让该节点的后继指向下一个节点的后继。
针对第二种情况,直接置空即可。
针对第三种情况,需要整个链表进行遍历,所以时间复杂度是O(n)。
分析一下这个算法的平均时间复杂度。对于n - 1个非尾节点而言,我们可以在O(1)时间内把下一个节点的内存复制覆盖要删除的节点,标红删除下一个节点;对于尾节点而言,由于仍然需要顺序查找,时间复杂度是O(n)。因此,总的平均时间复杂度为[(n - 1) * O(1) + O(n)] / n,结果还是O(1)。
代码:
public class DeleteNode {
//单链表的结构
publ