给定单向链表的头指针和一个结点指针,定义一个函数在 O(1)时间删除该结点。
void deleteNodeInO1InHasHeadLink(LinkList list,LNode*p)
{
if(list==NULL||list->next==NULL||p==NULL) {
return;
}
if(list->next->next==NULL) {//只有一个节点
if(p == list->next) {
list->next=NULL;//删除此节点
free(p);
}
printLinkList(list);
return;
}
LNode*temp = list;
if(p->next==NULL) {//尾节点
while(temp->next->next!=NULL) {
temp = temp->next;
}
//至此temp为要删除节点的前驱指针
free(temp->next);
temp->next=NULL;
printLinkList(list);
}else
{
//非首节点非尾结点删除
//把下一节点删除
LNode*deleteNode = p->next;
//把下一节点的值赋到本节点(本节点为实际要删除的结点)
p->data= deleteNode->data;
p->next= deleteNode->next;
free(deleteNode);
printLinkList(list);
}
}
网友评论