[英]Singly Linked List Time
给定一个单链表,其中包含一个指向头部的指针和一个指向尾部的指针。 哪个最耗时?
在开头插入节点
在末尾插入节点
在开头删除节点
最后删除节点
我认为在最后插入节点,因为要这样做,我们必须遍历整个链表,然后插入节点的数据,然后相应地链接节点。
但是,通过我所做的研究,最后删除节点似乎也是一个有效的选择,你会说哪个需要最多的时间?
最后删除节点:需要遍历所有链表,因为它需要更新倒数第二个节点以将下一个指针更新为NULL。
让我们看看每个人需要什么
在开始处插入节点:恒定时间
inserted.next = head
head = inserted
最后插入节点:恒定时间
tail.next = inserted
tail = inserted
开始删除节点:恒定时间
old_head = head
head = head.next
delete old_head
最后删除节点:线性时间<--最昂贵
old_tail = tail
new_tail = head
while new_tail.next is not None:
new_tail = new_tail.next
tail = new_tail
delete old_tail
分析这里的复杂性。
假设列表结构如下
node1->node2->node3->node4->node5
头-------------------------------------尾巴
在末尾插入节点:tail-> next = newNode; O(1)
删除节点结束:没有尾部的 prev 指针(因为它是单链表)所以必须遍历整个列表以找到第二个节点。 在)
secondlast_node->next = Null;
free(tail);
tail = secondlast_node;
(如果您设法以不同的方式构建列表,答案可能会改变)
如果您已经按照以下示例构建了链表
节点1<-节点2<-节点3<-节点4<-节点5
头 - - - - - - - - - - - - - - - - - - - - - - - - - - 尾巴
一开始删除节点成为最昂贵的操作
但在这两种情况下,最后插入节点都是 O(1) 复杂度
取决于你的指针在哪里。如果它在开头,它将在最后一个节点插入和删除。
如果您有两个指向头和尾的指针 1. 插入:都将 O(1) 视为只是修改头和尾指针。 2. 删除:头侧删除需要 O(1) 时间,但是尾需要前一个指针,需要 O(n) 时间复杂度。
假设:它是单链表。 对于 DLL 都需要 O(1)
案例研究:链表是一种线性数据结构,其中元素不存储在连续的内存位置。 链表中的元素使用指针链接,如下图所示: 链接中的每个元素称为一个节点,它由两部分组成: a. 节点存储的数据 b. 链接指向链表中的下一个节点 在此评估 2 中,您需要在 Visual Studio 中开发一个名为 LinkedList.cpp 的链表,它使用链表将浏览历史存储在 Web 浏览器中,使用 C++ 的以下方面:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.