O(1)的时间复杂度,删除链表指定节点

/*
给出一个单链表的头指针head和一节点指针toBeDeleted。O(1)时间复杂度删除结点toBeDeleted
对于删除节点,咱们普通的思路就是让该结点的前一个节点指向改节点的下一个节点
这种状况下须要遍历找到该节点的前一个节点,时间复杂度为O(n)。对于链表,链表的每一个节点的结构都是同样的,全部咱们能够把该节点的数据复制到该节点,而后删除下一个节点便可,注意最后一个节点的状况,这个状况只能用常见的方法来操做,找到前一个节点,但整体的平均时间复杂度仍是O(1)
*/
public void delete(Node head, Node toDelete){
    if(toDelete == null){
        return ;
    }
    if(toDelete.next != null){
        toDelete.val = toDelete.next.val;
        toDelete.next = toDelete.next.next;
    }else{ //删除的节点是尾节点的状况
        Node node = head;
        while(node.next != toDelete){//找到倒数第二个节点
            node = node.next;
        }
        node.next = null;
    }
}
相关文章
相关标签/搜索