在单项链表中用O(1)的时间删除指定节点

题目的前提是被删除的节点存在链表中。(如果要判断有没有在链表中,又得遍历,那时间肯定不会是O(1))

提到删链表节点p,首先想到是遍历整个链表,找到删除节点的前驱q,然后改变节点指向被删除的节点的下一个(q->next = p->next),删除节点(delete p),但是,这样删除单链表的某一节点,时间复杂度就是O(n),不符合要求;

时间复杂度是O(n)的做法就不说了,看看O(1)的写法,看图:

删除节点,需要找到被删节点的前驱,上面的说明,交换数据后,要删的节点转换为被删节点的后一个节点,此时被删节点前驱可以知道,删除就很简单了。

给出被删节点指针,O(1)时间内就可以有此方法删除节点,但是,如果,被删节点是链表最后一个节点,以上方法明显不在适用,不得不从头遍历:

这时就得从头遍历,只为找最后一个节点的前驱,就这唯一一个节点,找它的时间复杂度就是O(n),但平均时间复杂度为:

((n-1)*O(1)+O(n))/n    

结果还是O(1),复合要求的。

猜你喜欢

转载自blog.csdn.net/qq_36553031/article/details/88699430