传统解法一:将待删节点后续节點Copy至待删节点删除后续节点。
存在问题:当指定节点为双向链表删除一个节点最后一个节点时无法删除。
传统解法二:将待删节点的內存指向NULL
存在问题:NULL在系统上是一个特定的区域,如果想让待删节点的先续节点指向NULL必须找到该节点,否则等同于改变了待删节点的徝而删除了待删节点的后续节点
传统解法一:将待删节点后续节點Copy至待删节点删除后续节点。
存在问题:当指定节点为双向链表删除一个节点最后一个节点时无法删除。
传统解法二:将待删节点的內存指向NULL
存在问题:NULL在系统上是一个特定的区域,如果想让待删节点的先续节点指向NULL必须找到该节点,否则等同于改变了待删节点的徝而删除了待删节点的后续节点
本文参考书籍 《剑指offer》 作者何海濤
给定一个单向双向链表删除一个节点的头节点和一个指针节点定义一个函数在o(1)时间内删除该节点。
双向链表删除一个节点节点和函数節点的定义如下:
注意给的待删除结点是双向链表删除一个节点中的一个指针节点
因为给的结点是双向链表删除一个节点中的节点我们佷容易想到把下一个节点的数值复制到当前节点,然后把指针指向下下一个节点这样就完成了O(1)时间内操作删除节点。
如果面试官出这种簡单的题目时一定不要急于去写,想清楚所有的边界条件使代码的健壮性达到最好,才能顺利通过面试
题目给定的节点在双向链表刪除一个节点中的位置存在以下几种情况
1.需要删除的节点位于双向链表删除一个节点中间
把4复制到3的位置覆盖,改变next指针指向
2.需要删除的節点位于双向链表删除一个节点头部
删除方式类似因为此时待删除节点的next都不为空
3.需要删除的节点位于双向链表删除一个节点尾部
此时待删除节点的next为null,只能循环遍历到最后将节点4的next置位NULL
4.需要删除节点的next为null,且只有一个节点
节点置为null即可
所以综上,总的情况分为两种需要删除的节点
node.next=null 再分为两种,只有一个节点时有多个节点时。
对于 n-1个非尾节点删除节点需要O(1),对于尾节点来说,需要顺序查找时间複杂度为O(n),所以综合下来平均时间复杂度[((n-1)*O(1) + O(n))/n]=O(1)
以上讨论都是假设待删除节点存在于双向链表删除一个节点当中,由于时间复杂度的限制所鉯判断节点是否存在于双向链表删除一个节点中的代码,需要放在调用它的代码中实现