数据结构:删除单链表中p节点,时间复杂度O(1)


categories:

  • 数据结构

题目背景

在plist中删除p节点,时间复杂度要求O(1)

算法

因为时间复杂度为O(1),所以常规思路遍历链表是不行的。删除节点,其实是把该节点数据域清除,已知了p节点,那么可以知道它的next节点,所以可以把p节点的下一个节点的数据域赋值给p节点数据域,再让p节点的next指向p->next->next,就实现了p节点数据域的清除,也就间接删除了p节点。
如果p是最后一个节点,则只好遍历链表,复杂度O(n)
只有p是最后一个节点时间复杂度才是O(n),平均时间复杂度(O(1)*(n-1) + O(n))/n = O(1),所以该算法时间复杂度仍为O(1)

C代码

bool DeleteP(Linklist plist, Linklist p)//在plist中删除p节点,O(1)
{
    assert(plist != NULL);
    assert(p != NULL);
    if (plist == NULL || p == NULL)    
        return false;
    if (p->next != NULL)//p不是最后一个节点
    {
        //把p->next->data的值赋值给p->data,再让p->next指向下下个节点
        p->data = p->next->data;
        p->next = p->next->next;
        free(p->next);
        return true;
    }
    else//p是最后一个节点
    {
        LinkList tmp;
        for (; tmp->next->next != NULL;)
        {
            tmp = tmp->next;
        }
        tmp->next = NULL;
        free(tmp->next->next);
        return true;
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务