您的位置:首页 > Web前端

【剑指offer系列】 在O(1)时间删除链表节点___13

2016-04-07 15:36 211 查看
  题目描述:

  给定一个单链表的头节点指针和一个节点指针,在O(1)时间删除该节点    

  

  分析:

  要删除单链表的一个节点,正常的操作应是找到待删除节点的前驱节点,然后prev-next=toDel->next,再删除该节点

  但是本题时间复杂度要求是O(1),因此不能遍历链表去找到目标节点的前驱。只能考虑将next节点的值赋给该节点,然后删除next节点,也就是”懒删除“。

  但是如果要删除的节点为链表的尾部节点,那么还是需要遍历找到前驱。

  

  代码:  

void deleteNode(listNode *head,listNode *toDel){
if(head==NULL||toDel==NULL) return;
if(head==toDel){              //待删除为头节点
head=head->next;
delete toDel;
}else if(toDel->next==NULL){          //待删除为尾部节点
listNode *p=head;
while(p&&p->next!=toDel){
p=p->next;
}
p->next=toDel->next;
delete toDel;
}else{                 //待删除为中间节点
listNode *next=toDel->next;
toDel->val=next->val;
toDel->next=next->next;
delete next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: