繁体   English   中英

"单链表时间"

[英]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++ 的以下方面:

  1. 链表中具有适当数据类型的节点:每个节点存储在 URL(网址)中,它在链表中的当前位置(索引)以及链接到链表中的下一个节点。
  2. 插入 - 在行列列表的开头添加一个节点:方法签名是 void insertFirst(String newURL)
  3. 删除 - 删除链表开头的节点:方法签名是 void deleteFirst()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM