题目:给定单项链表的头指针和一个节点指针。定义一个函数在O(1)时间删除该节点。


解析:

删除单向链表中的一个节点,常规做法是必须找到待删除节点的前一个节点才干实现。而这样做的时间复杂度是O(n)。无法满足要求。

创新想法:当我们想删除一个节点时。并不一定要删除节点本身。能够用当前节点保存它下一节点的值,然后删除它的下一个节点。

情况案例:

1. 输入节点为NULL

2. 单链表仅仅有一个节点,即删除头节点

3. 待删除节点是尾节点,即没有下一节点

4. 待删除不是尾节点

当待删除节点是尾节点时。採用常规方法:须找到待删除节点的前一个节点才干实现O(n),但对于其它的非尾节点能够以O(1)的时间删除,因此平均时间复杂度是[(n-1)*O(1) + O(n)]/n,结果还是O(1)

本题批注:

删除一个节点时。并不一定要删除节点本身,可删除它的下一个

删除一个节点,要free或delete,而且置为NULL

typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 假设要找到待删除节点的前一结点就是O(n),
// 要想实现O(1)就不能查找。因此我们用待删除节点保存它下一节点的内容,然后删除下一节点
ListNode* DeleteElement(ListNode* head, ListNode* pToDeleted) {
if (head == NULL || pToDeleted == NULL)
return head;
// 仅仅有一个节点
if (head == pToDeleted) {
delete pToDeleted;
head = NULL;
pToDeleted = NULL;
return NULL;
}
if (pToDeleted->next == NULL) {
// 待删除的为最后一个节点
ListNode* pNode = head;
while (pNode->next != pToDeleted) // 常规方法找到待删除前一结点
pNode = pNode->next;
pNode->next = NULL;
delete pToDeleted;
pToDeleted = NULL;
} else {
// 要删除的节点不是尾节点
ListNode* pNext = pToDeleted->next;
pToDeleted->val = pNext->val;
pToDeleted->next = pNext->next;
delete pNext;
pNext = NULL;
}
return head;
}

13:在O(1)时间删除单链表节点的更多相关文章

  1. 删除单链表节点,时间复杂度为O(1)

    一个编程练习,删除单链表一个节点,且时间复杂度控制在O(1)内. 1.核心操作代码如下: struct ListNode { int m_data; ListNode *m_pNext; }; voi ...

  2. 题目13 在O(1)时间删除链表节点

    ///////////////////////////////////////////////////////////////////////////////////// // 3. 题目13 在O( ...

  3. 在O(1)时间内删除单链表结点

    // 在O(1)时间内删除单链表结点 /* 思考: 很显然链表是一个节点地址不连续的存储结构 删除节点一般很容易会想到是修改p节点的前一个节点的next为p->next 然而除非是双向链表,否则 ...

  4. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  5. 删除单链表倒数第n个节点

    基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ...

  6. cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针

    实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a- ...

  7. 在O(1)时间删除指定链表结点

    #region 在O(1)时间删除指定链表结点 /// <summary> /// 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. /// </summa ...

  8. leetCode题解之删除单链表中指定的元素

    1.问题描述 Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> ...

  9. C语言实现单链表节点的删除(带头结点)

    我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...

随机推荐

  1. vueJS 一天上手到精通

    近来用vuejs, vuejs和angular的不同在于它直接暴露了一个构造函数,而后在里面写各种config, 和模板再相对,而且vuejs也有对应的模板双向绑定机制,这样就使开发非常简单容易,虽然 ...

  2. 手机端的META

    一.天猫 <title>天猫触屏版</title> <meta content="text/html; charset=utf-8" http-equ ...

  3. MongoDB 聚合(管道与表达式)

    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). aggregate() 方法 MongoDB中 ...

  4. return 与 exit() 的区别

    return是一个关键字,返回函数值:exit()是一个函数: return是语言级的:exit()是操作系统提供的函数: return表示函数退出:exit()表示进程退出: 非主函数中调用retu ...

  5. kernelchina.org内核研究

    kernelchina.org 内核研究 转自:http://www.kernelchina.org

  6. 工作中常用Linux命令--服务器运维

    工作中常用Linux命令--服务器运维 lsof查看端口使用情况 lsof -i:8080更多lsof命令使用说明:http://www.cnblogs.com/peida/archive/2013/ ...

  7. STL模板整理 set

    SET set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序.应该注意的是set中数元素的值不能直接被 ...

  8. 从sizeof(string)到引用计数的漫游

    前言: 说是漫游,其实就是扯,一点一点的扯. 话说之前参加华为的德州扑克比赛,我用C++解析消息的时候碰到一个小问题,就是定长收消息的时候出错,在Linux下调了很久很久,终于发现,sizeof(st ...

  9. HDU 1280 前m大的数(排序,字符串)

      前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  10. CodeForces 32C Flea

    题目链接:http://codeforces.com/problemset/problem/32/C 本文链接:http://www.cnblogs.com/Ash-ly/p/5513436.html ...