经典算法学习——在O(1)时间删除链表节点

       这道算法题同样是剑指Offer中的一道题,题目描述为:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。其实我们知道,想要在单向链表中找到某个节点并删除它,复杂度为O(n),因为必须从头遍历才能找到它(最重要的是因为要找到它的前一个节点。)所以想要O(1)完成,必须想其他的方法。

      目前重要的一个信息就是已经有一个节点指针指向当前要删除的节点。这就比较好办了。我们可以非常方便的找到它的后继节点,然后把后继节点的值赋值给当前要删除的节点,然后再去删除那个后继节点。这样,我们看起来就像是删除了原来的那个节点。有点类似于移花接木。

核心代码如下:

void DeleteNode(Node **pListHead, Node *pToBeDeleted)
{
    // 把后一个节点的值复制到要删除
    pToBeDeleted->element = pToBeDeleted->next->element;
    // 使用delete释放后一个节点的内存
    delete pToBeDeleted->next;
    // 修改指针
    pToBeDeleted->next =  pToBeDeleted->next->next;
}

  完整代码示例上传至 https://github.com/chenyufeng1991/DeleteNodeInO1 。    

你可能感兴趣的:(算法设计,经典算法学习,算法,链表)