题目13 在O(1)时间删除链表节点
/////////////////////////////////////////////////////////////////////////////////////
// 3. 题目13 在O(1)时间删除链表节点
// 平均时间复杂度:[(n-1)*O(1) + O(n)] / n ---> O(1)
void DeleteListNode(ListNode<int>** ppNode, ListNode<int>* pDelNode)
{
if (NULL == ppNode)
{
return;
} // 1.如果不是尾节点
if (pDelNode->m_pNextNode != NULL)
{
ListNode<int>* pNext = pDelNode->m_pNextNode;
pDelNode->m_stData = pNext->m_stData;
pDelNode->m_pNextNode = pNext->m_pNextNode; delete pNext;
pNext = NULL;
}
// 2. 链表只有一个节点
else if (*ppNode == pDelNode)
{
delete pDelNode;
pDelNode = NULL;
*ppNode = NULL;
}
//链表中有多个节点,删除尾节点
else
{
// 这里时间复杂度O(n)
ListNode<int>* pNode = *ppNode;
while (pNode->m_pNextNode != pDelNode)
{
pNode = pNode->m_pNextNode;
} pNode->m_pNextNode = NULL;
delete pDelNode;
pDelNode = NULL;
} } void DeleteNode(CSingleList<int>* pList, int iDelValue)
{
ListNode<int>* pNode = pList->GetHeadNode();
ListNode<int>* pDelNode = pList->Find(pList->GetHeadNode(), iDelValue);
if (pDelNode && pNode)
{
// 删除节点
DeleteListNode(&pNode, pDelNode);
pList->Traversal();
}
} void DeleteNodeTestFunc()
{
cout << "\n\n --------------- DeleteNodeTestFunc Start -------------->" << endl;
int aiArray[] = {12, 14, 3, 67, 8, 65, 45, 67, 85, 45};
int iLen = sizeof(aiArray) / sizeof(int); CSingleList<int>* pList = new CSingleList<int>();
if (!pList)
{
return;
} // 构建链表
for (int i = 0; i < iLen; i++)
{
pList->Insert(aiArray[i]); // 头插法
} pList->Traversal(); int iDelVal = aiArray[iLen - 1];
cout << "1.删除头结点: " << iDelVal << endl;
DeleteNode(pList, iDelVal); iDelVal = aiArray[4];
cout << "2.删除中间节点: " << iDelVal << endl;
DeleteNode(pList, iDelVal); iDelVal = aiArray[0];
cout << "3.删除尾节点: " << iDelVal << endl;
DeleteNode(pList, iDelVal); // 释放内存
SAVE_DELETE(pList); cout << "\n\n --------------- DeleteNodeTestFunc End -------------->" << endl; }
题目13 在O(1)时间删除链表节点的更多相关文章
- 剑指offer-面试题13.在O(1)时间删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 链表节点与函数的定义如下. 通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点. 然后使得该节点的next ...
- 《剑指offer》面试题13 在O(1)时间删除链表节点 Java版
这道题的关键是知道找到尾节点的前一个节点必须遍历,而且这样做了之后总的时间复杂度还是O(1),以及如何不破坏链表删除一个已知节点 public ListNode delete(ListNode hea ...
- 面试题13:在O(1)时间删除链表节点
http://blog.csdn.net/jsqfengbao/article/details/47175249
- 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点 ...
- LeetCode之“链表”:在O(1)时间删除链表节点
下边讨论暂不包括尾节点. 一般来说,我们要删除链表中的一个节点是需要知道其上一节点的.但我们真的需要吗? 其实我们可以将待删节点的下一节点的值和指向的下一节点赋予待删节点,然后删除待删节点的下一节点. ...
- 剑指offer—第三章高质量代码(o(1)时间删除链表节点)
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...
- O(1)时间删除链表节点
问题描述:给定单相链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 这个比较简单,做不做解释,直接看参考代码,不过有一点就是要注意,还是要看删除的节点类型,不能保证总是O(1)时间 ...
- 剑指offer---以O(1)时间删除链表节点
问题:删除链表节点 要求:以O(1)时间 对于删除指定索引的链表元素大家都很熟悉,思路一般是从头遍历链表直到指定索引位置删除元素,然后维护一下指针即可,时间复杂度O(n).代码如下: // 删除pos ...
- 剑指Offer:面试题13——在O(1)时间删除链表结点
问题描述: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数的定义如下: public class ListNode{ int value; ListNode ...
随机推荐
- 数据结构实验之二叉树三:统计叶子数 SDUT 3342
#include <stdio.h> #include <string.h> struct node { char data; struct node *l,*r; }; st ...
- LinkedBlockingQueue和ArrayBlockingQueue的异同
相同: 1.LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口: 2.LinkedBlockingQueue和ArrayBlocking ...
- abd shell pm list packages
abd shell pm list packages ####查看当前连接设备或者虚拟机的所有包 adb shell pm list packages -d #####只输出禁用的包. adb she ...
- Maven:element '******' cannot have character [children]
此错误是由于XML文件的解析不正确造成的,因为在一个/某些标签之间存在奇怪和隐藏的字符. 这些字符可能来自网络上的复制粘贴.要解决此问题,请删除标签>标记定义之间的所有空格和换行符,然后将它们放 ...
- 定位ScheduledExecutorService过了一段时间不执行问题
今天查看生产环境的sentinel控制台,发现某dubbo应用一共5个节点,有3个失联了. 查看失联节点的应用日志,服务没有挂,各dubbo接口的日志正常在打印. 在应用节点ping/telnet s ...
- VBA 格式化excel数据表 (数据分列)
Sub ImportData() ' ' Copy Data from one workbook to the Current Workbook ' Place the macro file in t ...
- [Bayes] *Bayesian Classifier for Face Recognition
Bayesian在识别领域的贡献,着实吸引人 阅读笔记 Gabor特征 (简介,另单独详述) 通过上面的分析,我们知道了,一个Gabor核能获取到图像某个频率邻域的响应情况,这个响应结果可以看做是图像 ...
- 小记LoadRunner 11 安装VC2005运行环境报错处理
这几天在做性能优化,需要在虚拟机里装个LoadRunner 11.从测试同学那里搞来安装包,按照文档提示安装系统运行环境,提示我要装VC2005 SP1. 安装程序自己安装,报错.截图如下. 于是我又 ...
- lnmp搭建-手动版
参照链接:http://blog.csdn.net/bravemelon/article/details/64925499 centOS 下安装 Nginx yum -y groupinstall & ...
- 容器版Jenkins连接Kubernetes---------非容器版jenkins是无法安装kubenetes插件的,所以无法连接k8s
容器版Jenkins连接Kubernetes 特别注意:必须用谷歌浏览器,而且非容器版jenkins是无法安装kubernetes插件的,所以无法连接k8s 一.环境说明 OS系统版本:Ubuntu ...