在O(1)时间删除链表结点

给定单向链表的头指针和一个结点指针,定义一个函数在 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);

    }

}

你可能感兴趣的:(在O(1)时间删除链表结点)