一、题目描述:
在 O(1) 时间内删除链表节点,链表形如下图所示:
二、解题思路:
首先创建一个链表类,根据上图所示,只有next链,分两种情况:1)删除的节点是非尾节点,此时,可将该节点下一个节点的值赋值给该节点,并让该节点指向下一节点的下一节点;2)删除的节点是尾节点,若此时链中只有一个节点,则直接删除,返回null即可,否则从头节点经过不断遍历,直至找到要删除的节点的前一个节点,假设为cur,直接让cur.next=null,即可。
三、代码:
public ListNode todeleteNode(ListNode head, ListNode deleteNode) {
if(head == null || deleteNode == null) {
return null;
}
if(deleteNode.next != null) { // 要删除的节点不是尾节点
ListNode next = deleteNode.next;
deleteNode.val = next.val;
deleteNode.next = next.next;
}
else {
if(head.next == null) { //要删除的节点是唯一的一个节点
return null;
}
else { //删除的节点是多节点的尾节点
ListNode cur = head;
while(cur.next != deleteNode) {
cur = cur.next;
}
cur.next = null;
}
}
return head;
}
分析:由于删除前面N-1个非尾节点花费的时间为N-1,删除最后一个尾节点的时间花费为N,平均下来删除一个节点花费的时间为:(N-1+N)/N 约等于2,故平局复杂度为O(1)。