转自http://blog.csdn.net/qq1501340219/article/details/54612616?locationNum=14&fps=1
题目描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
题目解析:如果从头到尾遍历找到要删除的节点的前一个节点,将前一个节点的next指针指向删除节点的next,那么时间复杂度是O(n)。所以不能这样做。如果采取是将删除节点的下一个节点的值复制到要删除的节点,然后再将下一个节点删除,那么时间复杂度就是O(1)。如果要删除的节点是最后一个节点,那么我们还是需要遍历链表。所以总时间复杂度应该这么算,[(n-1)*O(1)+O(n)]/n,结果是O(1)。
public static ListNode deleteNode(ListNode head, ListNode delete) {
if (head == null || delete == null) {
return head;
}
if (head == delete) {
return head.next;
}
if (delete.next == null) {
ListNode temp = head;
while (temp.next != delete) {
temp = temp.next;
}
temp.next = null;
} else {
delete.data = delete.next.data;
delete.next = delete.next.next;
}
return head;
}