单链表插入删除元素时间复杂度探究
来源:互联网 发布:xp 在端口23连接失败 编辑:程序博客网 时间:2024/05/17 01:51
单链表相比数组的优势在于插入删除元素快,不需要移动大量的元素,只需要改变指针的指向,那么插入删除操作的时间复杂度应该是O(1),但是这是不对的,应该分情况讨论。
单链表结构体声明:
typedefstruct LNode{ ElemType data; struct LNode *next;}LNode,*LinkList;
1. O(n)的情况:
1) 一个已知头结点的链表(假设足够长),删除第index个元素。
首先我们需要从头开始向后遍历,直到找到第index-1个结点,这需要O(n)时间;找到以后,改变指针的指向,这需要O(1)的时间。所以这种情况下,时间复杂度为O(n)。
代码:
LinkListhead;LinkListp=head;inti=0;while(p&&i<=index-2)//找到第index-1个结点退出{ p=p->next; i++;}LinkListq=p->next;//q是第index个节点,即要删除的节点p->next=q->next;//转移指针free(q);//释放内存<pre name="code" class="cpp">LinkListnewnode=(LinkList)malloc(sizeof(LNode));newnode->data=newdata;newnode->next=node->next;node->next=newnode;
q=NULL;//指向空指针
2) 一个已知头结点的链表(假设足够长),在第index个元素前插入一个元素。
首先我们需要从头开始向后遍历,直到找到第index-1个结点,这需要O(n)时间;找到以后,创建新节点,改变指针的指向,这需要O(1)的时间。所以这种情况下,时间复杂度为O(n)。
代码:
LinkList head;LinkList p=head;int i=0;while(p&&i<=index-2){ p=p->next; i++;}LinkList newnode=(LinkList)malloc(sizeof(LNode));newnode->data=newdata;newnode->next=p->next;p->next=newnode;
2. O(1)的情况
1) 一个已知头结点的链表(假设足够长),删除某结点,且告诉你该元素的地址node(struct LNode*类型)。
由于这是单链表,我们无法获取node前一个节点的地址,因此好像不能删除这个结点。但是在我们看来,是否删除这个节点只是看这个节点的data值是否还存在于链表中,因此,我们可以让链表看起来删除了node,实则删除了结点node->next.
代码:
LinkListnode2=node->next;node->data=node2->data;//移交元素node->next=node2->next;//移交指针free(node2);//释放目标删除结点后一个节点的内存node2=NULL;//置空指针
这样,我们便“删除”了node结点,实则并没有删除,只是看起来删除了,实际上node->next成了真正的牺牲品。上述操作在O(1)内完成。
2) 一个已知头结点的链表(假设足够长),在某结点后面插入新节点,大小为newdata,且告诉你该结点的地址node(struct LNode *类型)。
代码:
LinkListnewnode=(LinkList)malloc(sizeof(LNode));newnode->data=newdata;newnode->next=node->next;node->next=newnode;
上述操作O(1)时间内完成。
- 单链表插入删除元素时间复杂度探究
- 7. 二叉排序树的搜索、插入、删除,时间复杂度
- 常见数据结构的查找、插入、删除时间复杂度
- O(1)时间复杂度删除链表元素
- 快慢指针的时间复杂度探究
- map vector 插入时间复杂度
- python插入,删除元素
- 用Lua实现插入、删除和查找时间复杂度为O(1)的集合
- 用Lua实现插入、删除和查找时间复杂度为O(1)的集合
- 链式存储中在第i个位置插入或删除的时间复杂度
- 线性表、栈、队列等查找、删除、插入的时间复杂度O()
- 线性表、栈、队列等查找、删除、插入的时间复杂度O()
- c语言实现线性表的建立,初始化,插入,删除,查找,遍历以及时间复杂度分析
- 数据结构之 删除顺序表中所有元素为X 的元素,要求时间复杂度为O(n),空间复杂度为O(1)
- 作业:递归实现插入排序和在o(nlgn)时间复杂度内寻找和为定值的两个元素
- 插入排序的时间复杂度而
- 插入排序的时间复杂度分析
- 插入排序和时间复杂度下界
- 链表概述
- leetcode swap nodes in pairs
- C & Prime
- Node.js静态资源类文件请求处理
- 线性表顺序存储(数组)及其15种操作的实现
- 单链表插入删除元素时间复杂度探究
- c/c++学习工具 CodeBlocksIDE
- Swift XXXLiteralConvertible 协议的使用
- .post简化.ajax方式提交form表单
- android系统深入研究
- LeetCode - Container With Most Water
- 正则表达式
- AJAX中的onreadyStateChange事件
- CocoaPods的傻瓜使用方法