题目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 ...
随机推荐
- 畅通工程续(HDU 1874)(简单最短路)
某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在 ...
- Ubuntu 14.04 用户操作
新建用户sudo adduser linuxidc 修改hosts文件sudo gedit /etc/hosts ubuntu修改主机名sudo gedit /etc/hostname 删除用户在ro ...
- shell 字符串分割cut
cut 选项与参数 -d:后面接分隔字符.与-f一起使用. -f:依据-d的分隔字符将一段信息分隔数段,用-f取出第几段的意思. -c:以字符的单位取出固定字符区间 [zhang@localhost ...
- HDU 4374 One hundred layer(单调队列DP)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=116242#problem/E 题意:差不多就是男人勇下百层的游戏.从第一层到最 ...
- jinjia2-HTML 转义
当从模板生成 HTML 时,始终有这样的风险:变量包含影响已生成 HTML 的字符.有两种 解决方法:手动转义每个字符或默认自动转义所有的东西. Jinja 两者都支持,使用哪个取决于应用的配置.默认 ...
- Java实现单例的5种方式
1. 什么是单例模式 单例模式指的是在应用整个生命周期内只能存在一个实例.单例模式是一种被广泛使用的设计模式.他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存. 2. 单例模 ...
- mysql —日志记录
日志 事务日志: transaction log 中继日志: reley log错误日志: error log 通用日志: general log 慢查询日志: slow query log 二进制日 ...
- 【Python】对我自己的博客进行统计,看看哪年哪月发帖量最大
代码很简单,主要利用了requests进行网络访问,beautifulSoup进行页面文本分析,re进行正则表达式抽取文字,前面两个需要pip install name去安装,后者是内部对象所以不用安 ...
- 利用mysql数据库中的TMD表修复“is marked as crashed and last (automatic?) repair failed”的错误 Database query error
===========================测试成功============================================= 1.页面出现错误:Database query ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_20-页面静态化-静态化测试-填写页面DataUrl
启动前端和后端.轮播图的数据url可以在这里修改. 找到列表页面的轮播图,然后点击编辑 随便更新一个地址测试 提交后数据再次编辑 发现url没有变化 在pageService里面update方法把更新 ...