13:在O(1)时间删除单链表节点
题目:给定单项链表的头指针和一个节点指针。定义一个函数在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)时间删除单链表节点的更多相关文章
- 删除单链表节点,时间复杂度为O(1)
一个编程练习,删除单链表一个节点,且时间复杂度控制在O(1)内. 1.核心操作代码如下: struct ListNode { int m_data; ListNode *m_pNext; }; voi ...
- 题目13 在O(1)时间删除链表节点
///////////////////////////////////////////////////////////////////////////////////// // 3. 题目13 在O( ...
- 在O(1)时间内删除单链表结点
// 在O(1)时间内删除单链表结点 /* 思考: 很显然链表是一个节点地址不连续的存储结构 删除节点一般很容易会想到是修改p节点的前一个节点的next为p->next 然而除非是双向链表,否则 ...
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- 删除单链表倒数第n个节点
基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ...
- cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针
实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a- ...
- 在O(1)时间删除指定链表结点
#region 在O(1)时间删除指定链表结点 /// <summary> /// 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. /// </summa ...
- leetCode题解之删除单链表中指定的元素
1.问题描述 Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
随机推荐
- mongoDB文档操作【增删改】
MongoDB 插入文档 文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON. 插入文档 Mo ...
- MySQL中EXISTS的用法
比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...
- POJ2255(二叉树遍历)
Tree Recovery Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13000 Accepted: 8112 De ...
- KVM分析报告
转载 KVM分析报告 虚拟化技术工作组 2008-12-31 1. 概述 1.1. KVM简介 KVM是以色列开源组织Qumranet开发的一个开源虚拟机监控器,从Linux-2. ...
- git常用命令收集
[git远程操作命令] 1.$ git remote –v #查看本地配置的所有远程仓库,内容为远程仓库的地址和本地别名 harvey@harvey:~/node$ git remote -v nod ...
- BZOJ 1800
1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1622 Solved: 1293[Submit][St ...
- python gui tkinter用法杂记
1.treeview遍历 iids = tree.selection() t = tree.get_children() for i in t: print(tree.item(i,'values') ...
- flask的插件
详情参考官方文档 组件一:flask-session 安装: pip install flask-session 使用方法:先导入 from flask_session import Sess ...
- 在Servlet中获取Spring注解的bean
最近由于项目中出现了Servlet调用Spring的bean,由于整个项目中所有的bean均是注解方式完成,如@Service,@Repository,@Resource等,但是Spring的容器管理 ...
- shell字符串变量的特异功能:字符串的替换(${str/源模式/目标模式},${str//源模式/目标模式})、截断
https://blog.csdn.net/wzb56_earl/article/details/6953612