/*
给出一个单链表的头指针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;
}
}
转载于:https://my.oschina.net/u/2477353/blog/662784