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: ...
随机推荐
- Windows 的GUID
GUID(全称:Globally Unique Identifier),是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情况下,任何 ...
- 教你从头到尾利用DQN自动玩flappy bird(全程命令提示,GPU+CPU版)【转】
转自:http://blog.csdn.net/v_JULY_v/article/details/52810219?locationNum=3&fps=1 目录(?)[-] 教你从头到尾利用D ...
- Kuangbin 带你飞-线段树专题 题解
HDU 1166 敌兵布阵 单调更新区间查询和 #include <map> #include <set> #include <list> #include < ...
- appium===报错Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install io.appium.settings without first uninstalling.的解决办法
要解决的问题:appium在androidV7.0系统上运行时报错 Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install io.a ...
- JWT是什么?
# 转载请留言联系 什么是JWT? Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的 ...
- vim操作大全
# 转自 https://blog.csdn.net/weixin_37657720/article/details/80645991 曾经使用了两年多的Vim,手册也翻过一遍.虽然现在不怎么用vim ...
- Selenium2+python自动化60-异常后截图(screenshot)【转载】
前言 在执行用例过程中由于是无人值守的,用例运行报错的时候,我们希望能对当前屏幕截图,留下证据. 在写用例的时候,最后一步是断言,可以把截图的动作放在断言这里,那么如何在断言失败后截图呢? 一.截图方 ...
- k8s的Dashboard
前面章节 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户体验,Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 ...
- yii2.0在model里自定义数据表
无需多言,直接撸代码 class Zhuanjia extends \yii\db\ActiveRecord { public static function tableName() { return ...
- Asp.net中的一个判断session是否合法的做法
1 if (Session["UserID"] == "" || Session["UserID"] == null) 2 { 3 ...