题目
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
思路
/删除节点通常的思路:找删除节点的前一个节点,需要遍历,时间复杂度为o(n),如果想要时间复杂度为o(1),那么可以使用待删除节点的后一个节点去覆盖待删除节点,然后再去删除后一个节点,这里有特殊情况,就是带删除节点是头结点,那么要将头结点置位空,如果带删除节点是链表的尾节点,那么只能从头遍历。
代码实现
public static void deleteNode(ListNode head,ListNode pToBeDeleted) {
if(head==null|| pToBeDeleted==null){
return;
}
if(head==pToBeDeleted){ //如果链表只有一个节点
head=null;
pToBeDeleted=null;
}else if(pToBeDeleted.next==null){//如果删除的节点是尾结点
ListNode cur=head;
while (cur!=pToBeDeleted&&cur!=null){
cur=cur.next;
}
cur.next=null;
}else{//是正常情况
ListNode node1=pToBeDeleted.next;
pToBeDeleted=node1;
node1=null;
}
}