题目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 ...
随机推荐
- ERROR 1010 (HY000): Error dropping database (can't rmdir './zabbix/', errno: 17)
在删除数据库的时候报标题所示错误 mysql> drop database zabbix; ERROR 1010 (HY000): Error dropping database (can't ...
- css 计算值函数
css有一些强大的函数: 1. calc 可以混合多种单位来计算 div { font-size: calc(100vw/5 + 1rem - 100px) } 2. max.min.clamp ma ...
- java课后实验性问题6
1.继承条件下的构造方法调用. class Grandparent { public Grandparent(){ System.out.println("GrandParent Creat ...
- 转载: beta分布介绍
最近在看机器学习方面的资料,作为入门的李航教授所写的<统计机器学习>一书,刚看完第一章我也是基本处于懵了的状态,其中有一道题提到贝叶斯估计,看了下网上的资料都提到了一个叫做 beta分布的 ...
- 18.flannel
18.flannel docker有四种常用网络 bridge joined opended 直接共享使用节点的网络名称空间 none k8s网络通信: 容器间的通信: 同一个Pod内的多个容器之间通 ...
- [maven]idea+maven的多项目依赖
如下两个项目: test-main test-utils 其中test-main需要引用test-utils. 最终效果如下: 实现步骤: 1:新建一个Empty Project作为框架项目 输入框架 ...
- UC浏览器打开百度显示 丰臣吉秀.网址
- 08ListView动态列表组件 以及循环动态数据
效果: main.dart import 'package:flutter/material.dart'; import 'res/listData.dart'; /* ListView:参数 scr ...
- delphi7 treeview + 数据库 实现动态节点维护
首先说下树节点对应的表的基本结构,必需要有的字段(节点编号,父节点编号,节点名称),其他字段根据你开发的需要添加从添加节点开始,一开始就取出表中最大节点编号,每次添加节点的时候,该节点编号增加1;添加 ...
- MLN Alchemy
1. 前言: 本文主要参考Alchemy Tutorial, washington主页上挂出的所有Alchemy项目(包括Alchemy1.0, Alchemy2.0, AlchemyLite)都无法 ...