如何在o时间删除链表节点
发布网友
发布时间:2022-05-01 02:01
我来回答
共1个回答
热心网友
时间:2022-06-22 04:57
算法思路:
一般我们是从头节点开始遍历,知道找到要删除的节点的前面一个节点,但是时间复杂度为O(n)
改进思路:找到要删除的节点pDeleteNode的下一个节点pNext,把下一个节点的值(pNext->m_nValue)
赋给要删除的节点(PDeleteNode->m_nValue),再把要删除的节点指向下一个节点的下一个节点:(pDelete->m_pNext = pNext->m_pNext)
然后再把pNext节点删除,pNext = NULL;
代码:
[cpp] view plain copy print?
// DeleteNodeInList.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
/*
算法思路:
一般我们是从头节点开始遍历,知道找到要删除的节点的前面一个节点,但是时间复杂度为O(n)
改进思路:找到要删除的节点pDeleteNode的下一个节点pNext,把下一个节点的值(pNext->m_nValue)
赋给要删除的节点(PDeleteNode->m_nValue),再把要删除的节点指向下一个节点的下一个节点:(pDelete->m_pNext = pNext->m_pNext)
然后再把pNext节点删除,pNext = NULL;
*/
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)
{
if (!pListHead || !pToBeDeleted)
{
return;
}
if (pToBeDeleted->m_pNext != NULL)//删除的节点不是尾巴节点
{
ListNode* p = pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue = p->m_nValue;
pToBeDeleted->m_pNext = p->m_pNext;
delete p;
p = NULL;
}
else if (*pListHead == pToBeDeleted)//链表只有一个节点,删除头节点也是尾巴节点
{
delete pToBeDeleted;
pToBeDeleted = NULL;
*pListHead = NULL;
}
else//链表中有多个节点,删除尾巴节点
{
ListNode* pNode = *pListHead;
while (pNode->m_pNext != pToBeDeleted)
{
pNode = pNode->m_pNext;
}
pNode->m_pNext = pToBeDeleted->m_pNext;
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}
/*
分析: 对于n-1个非尾巴节点而言,我们可以在O(1)的时间把下一个节点的内存复制覆盖要删除的节点,并删除下一个节点;
对于尾巴节点而言,由于仍然需要顺序查找,时间复杂度是O(n).因此总的平均时间复杂度是[(n-1)*O(1)+O(n)]/n,因此平均时间
复杂度是O(1);
*/
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
对于n-1个非尾巴节点而言,我们可以在O(1)的时间把下一个节点的内存复制覆盖要删除的节点,并删除下一个节点;
对于尾巴节点而言,由于仍然需要顺序查找,时间复杂度是O(n).因此总的平均时间复杂度是[(n-1)*O(1)+O(n)]/n,
因此平均时间复杂度是O(1);
interview-o 代码用法
interview-o给定链表的头指针和一个结点指针,在O(1)时间内删除该结点。需要注意的是,这里只是删除该结点的步骤为O(1),而不是查找到该结点的时间复杂度。求解思想:一般来说,我们删除链表中的一个结点是将在它前驱结点上进行操作,将它前驱结点的next指针指向K的后继节点,K的后继指向NULL,然后删...
多个文件表格合并成一个
作为上海悉息信息科技有限公司的一员,我们专注于提供高效的数据处理解决方案。对于多个文件表格的合并需求,我们通常采用专业的数据整合技术,确保数据的准确性和一致性。通过精确匹配表格字段和格式,我们能够快速、准确地将多个表格合并成一个,为用户提供更加便捷的数据管理和分析体验。这一服务广泛应用于各种行业,帮助客户实现数据的有效整合和利用。Excel一键自动匹配,在线免费vlookup工具,3步完成!Excel在线免费vlookup工具,点击65步自动完成vlookup匹配,无需手写公式,免费使用!
链表(带头结点)基本操作实验
删除操作也需要从头引用开始遍历单链表,直到找到第i个位置的结点。如果i为1,则要删除第一个结点,则需要把该结点的直接后继结点的地址赋给头引用。对于其它结点,由于要删除结点,所以在遍历过程中需要保存被遍历到的结点的直接前驱,找到第i个结点后,把该结点的直接后继作为该结点的直接前驱的直接后...
单链表 插入元素 时间复杂度能否为O(1)?删除呢?
不能。首先要找到要插入或删除的结点的前一个位置 ,需要 O(n)。然后插入或删除是O(1)合计所需要的时间是O(n)+O(1)=O(n).很多人对链表的插入和删除误认为有很大的时间优势是错的。和顺序表一样,都是O(n).单链表的好处是不需要大量数据元素。而对运行时间复杂度没有改善。
...使得最后得到的链表中的所有结点的数据域值都不同。
}until p=null 时间为O(n) 空间O(m)
什么是链表
相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。使用链表结构可以克服数组链表需要预先知道数据大小的...
LeetCode 82 - 删除排序链表中的重复元素 II (Python3|Go)
如果 is_pre_duplicated 是 false ,则最后一个结点的值不重复,加入到结果链表中 时间复杂度:O(n)空间复杂度:O(1)代码(Python3)代码(Go)代码(Rust)题目链接:Remove Duplicates from Sorted List II :leetcode.com/problems/r...删除排序链表中的重复元素 II:leetcode-cn.com/problem.....
循环单链表问题。数据结构学得好的解释一下
第二类链表则麻烦一点,因为知道n不能直接找出n+1,要从尾部往回扫描至n+1,这个过程是线性级的.然后把n+1的头指针指向w,w的头指针指向n.这个过程常数级.合起来就是线性级O(n)删除时,一般是定位n删除n+1,这时候先找出n+2,然后将n的尾指针指向n+2即可.这样只用常数级操作O(1).对于第二类我有...
用算法实现:单链表和顺序表删除。删除顺序表中值相同的多余结点_百度知 ...
{//原有堆元素在R->data[1]~R->data[R->length], //将R->data[i]删除,即将R->data[R->length]放入R->data[i]中后, //将R->length减1,再进行堆的调整, //以R->data[0]为辅助空间,调整为堆(此处设为大根堆) int large;//large指向调整结点的左右孩子中关键字较大者 ...
在单链表中删除一个指定节点的后继的时间复杂度是多少?
1. 考虑单链表具有n个节点的情况,删除第i个节点的后继的时间复杂度是O(n)。2. 这是因为在最坏的情况下,需要找到指定节点的前驱,这需要访问前n-1个节点,以便能够更新第i个节点的指针,从而删除其后继。3. 具体来说,存在一个for循环,其条件为i<n,这意味着循环将执行n-1次。4. 在每次...
数据结构
选D,很多人选C,因为他们没有考虑到删除节点时带尾指针的单循环链表和带头结点的双循环链表的差别,在末尾删除结点是,在带尾指针的单循环链表中指针就得顺序遍历到要删除的结点的前一位,如果链表长度是n那么时间复杂度是O(n),而带头结点的双循环链表只需修改front指针即可时间复杂度是0(1)...