在O(1)时间内删除节点
解析
1 如果不是尾节点,将要删除节点后继节点的值赋予当前节点,再将当前节点后继指向后继的后继,达到目的
2 如果是尾节点,则遍历至前一个节点,直接将前一个节点的后继指向null
时间复杂度分析:如果进行N次操作,N-1种可能性不会死尾节点,则操作次数为N-1,一种可能性为尾节点,操作次数为N。
所以总操作次数为2N-1.平均复杂度为2N-1/N = O(1)
代码:
public ListNode deleteNode(ListNode head, ListNode tobeDelete){
if (head == null || tobeDelete == null)
return null;
if (tobeDelete.next != null) {
// 要删除的节点不是尾节点
ListNode next = tobeDelete.next;
tobeDelete.val = next.val;
tobeDelete.next = next.next;
}
else {
if (head == tobeDelete)
// 只有一个节点
head = null;
else {
ListNode cur = head;
while (cur.next != tobeDelete){
cur = cur.next;
}
cur.next = null;
}
}
return head;
}