/////////////////////////////////////////////////////////////////////////////////////

// 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)时间删除链表节点的更多相关文章

  1. 剑指offer-面试题13.在O(1)时间删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 链表节点与函数的定义如下. 通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点. 然后使得该节点的next ...

  2. 《剑指offer》面试题13 在O(1)时间删除链表节点 Java版

    这道题的关键是知道找到尾节点的前一个节点必须遍历,而且这样做了之后总的时间复杂度还是O(1),以及如何不破坏链表删除一个已知节点 public ListNode delete(ListNode hea ...

  3. 面试题13:在O(1)时间删除链表节点

    http://blog.csdn.net/jsqfengbao/article/details/47175249

  4. 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点 ...

  5. LeetCode之“链表”:在O(1)时间删除链表节点

    下边讨论暂不包括尾节点. 一般来说,我们要删除链表中的一个节点是需要知道其上一节点的.但我们真的需要吗? 其实我们可以将待删节点的下一节点的值和指向的下一节点赋予待删节点,然后删除待删节点的下一节点. ...

  6. 剑指offer—第三章高质量代码(o(1)时间删除链表节点)

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...

  7. O(1)时间删除链表节点

    问题描述:给定单相链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 这个比较简单,做不做解释,直接看参考代码,不过有一点就是要注意,还是要看删除的节点类型,不能保证总是O(1)时间 ...

  8. 剑指offer---以O(1)时间删除链表节点

    问题:删除链表节点 要求:以O(1)时间 对于删除指定索引的链表元素大家都很熟悉,思路一般是从头遍历链表直到指定索引位置删除元素,然后维护一下指针即可,时间复杂度O(n).代码如下: // 删除pos ...

  9. 剑指Offer:面试题13——在O(1)时间删除链表结点

    问题描述: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数的定义如下: public class ListNode{ int value; ListNode ...

随机推荐

  1. Selenium调用使用360浏览器,QQ浏览器,遨游浏览器,猎豹浏览器,Chromium

    国产的360安全浏览器,360急速浏览器,QQ浏览器,遨游浏览器甚至新版还未上市的Edge浏览器都是基于Chrome浏览器的开源版本Chronium开发来的.所以360浏览器可以理解为一个定制的Chr ...

  2. elasticsearch sql插件 2.4及以下版本配置

    github地址:https://github.com/NLPchina/elasticsearch-sql/ 方式一:github elasticsearch-sql上提供的安装方法cmd进入到本地 ...

  3. YouTube 网站的架构演进——阅读心得

    基础平台 Apache Python Linux(SuSe) MySQL psyco,一个动态的Python到C的编译器 lighttpd代替Apache做视频播放 状态 支持每天超过5亿的视频点击量 ...

  4. 牛顿法与拟牛顿法(四) BFGS 算法

    转自 https://blog.csdn.net/itplus/article/details/21897443

  5. mysql数据库每个表的备份脚本

    对mysql数据库中的每张表进行按日期备份,思想是:先把每张表的表名取出取出,然后通过for循环去对每个表进行按日期备份 [root@ZFVM-APP-- backup]# vim dataname. ...

  6. 转贴:PLSQL中 commit 和 rollback 的区别

    PLSQL中 commit 和 rollback 的区别 原文链接:https://blog.csdn.net/jerrytomcat/article/details/82250915 一. comm ...

  7. docker swarm和 k8s对比

    Swarm的优势:swarm API兼容docker API,使得swarm 学习成本低,同时架构简单,部署运维成本较低.Swarm的劣势:同样是因为API兼容,无法提供集群的更加精细的管理.在网络方 ...

  8. vector swap

    #include <iostream>#include <vector>#include <list>#include <deque> using na ...

  9. javaweb大文件上传

    本文主要关于利用html表单上传文件的后台代码实现. 需要用到两个工具类Apache commons-fileupload和commons-io. 注意要校验是否选择文件上传,最开始写的时候没有加上校 ...

  10. Delphi实现树型结构具体实例

    unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...