题目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 ...
随机推荐
- mac brew 使用教程
brew services list #查看系统通过 brew 安装的服务 brew services cleanup #清除已卸载无用的 ...
- SDUT2176 -> 递归的函数
递归的函数 Time Limit: 1000 msMemory Limit: 65536 KiB Problem Des ...
- xpath简介备查
xpath简介 xpath 使用路径表达式在xml和html中进行导航 xpath包含标准函数库 xpath是一个w3c的标准 xpath节点关系 父节点 子节点 同袍节点 先辈节点 后代节点 xpa ...
- 使用python开发ansible自定义模块的简单案例
安装的版本ansible版本<=2.7,<=2.8是不行的哦 安装模块 pip install ansible==2.7 先导出环境变量 我们自定义模块的目录. 我存放的目录 export ...
- c++ demo code
/* //多继承 #include <iostream> using namespace std; class Sofa { public: Sofa(); ~Sofa(); void s ...
- shell 显示详细信息
MacdeMacBook-Pro:test macname$ ls -al | more total drwxr-xr-x macname staff : . drwxr-xr-x+ macname ...
- mlflow ui 启动报错No such file or directory: 'gunicorn': 'gunicorn'
1.mlflow ui 启动报错,信息如下: [root@localhost mlflow]# mlflow ui /usr/local/python3/lib/python3./importlib/ ...
- Infralution.Localization.Wpf
WPF Localization Using RESX Files Once you have downloaded the source code and built it, add a refer ...
- 【java】[sql]使用Java程序向MySql数据库插入一千万条记录,各种方式的比较,最后发现insert批量插入方式对效率提升最明显
我的数据库环境是mysql Ver 14.14 Distrib 5.6.45, for Linux (x86_64) using EditLine wrapper 这个数据库是安装在T440p的虚拟机 ...
- appStore上传苹果应用程序软件发布
首先确定帐号是否能发布, https://developer.apple.com/account,如果你打开Provisioning Portal,然后点击DisTribution(1)图中加号是灰色 ...