我读过许多文章,其中提到当我们必须在集合的中间执行插入/删除操作时,链表的性能会很好。但是我在这里有疑问。我正在学习数据结构,如果我的理解不正确,请通知我。
假设列表中有10个项目
索引:-0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
项目:-A |我Z | S | J | T | V | J | A | T
我想删除索引6表示“ V”的项目,然后我们必须将其他项目上移一级。我知道当我们的名单很大时,这种转移是一项昂贵的操作。
在“链表”的情况下,我们不必移动项目,因为我们只需更改指向新节点的上一个指针和下一个指针即可。
示例-
HeadNode A => D => Z => S => C => W => M => Q => E => T
现在假设我们必须删除W,然后根据我的理解,我们必须从头节点(A)遍历到W。因此,这也是昂贵的操作,如清单中所示,在删除后我们要转移项目。 然后,这种情况如何使链表优于链表
答案 0 :(得分:1)
仅当您已经有对要插入或删除的节点的引用时,在链表中间插入和删除才很快,因此您不必遍历该列表即可找到它。
在C#中,当通过引用(这样就不必查找对象)或通过其他集合或索引来标识对象时, container_last_seen{architecture="x86_64",com_docker_swarm_service_name="CGI_osm",instance="10.0.0.17:8080",job="cadvisor",name="CGI_osm.2.s2s3fsxs7sts2qvzmy4l1izse",node_name="dvvmclust4",service_description="carto OSM",service_name="OSM",service_version="latest",summary="Provides the latest release of OSM"...}
集合很有用,并且列表中的每个项目都可以有一个对其LinkedList
的引用。
使用LinkedListNode
的一个很好的例子是LRU缓存-缓存由字典和链接列表组成。当您在词典中找到一个项目时,您将移至列表的前面。如果该项目引用了其LinkedList
,则无论列表最初位于何处,您都可以恒定的时间将其移到最前面。
在不公开节点类的Java中,LinkedListNode
集合几乎没有用。
答案 1 :(得分:0)
链表的优点是可以无限期地将元素添加到链表中(取决于可用的内存),而数组最终将被填充或需要调整大小(这并非总是可以进行的昂贵操作)。
当列表中的项目总数未知并且不需要随机访问元素时,最适合使用链接列表。当我们对列表中的项目数有上限的想法,并且需要对元素的随机访问时,数组更适合。
此外,如果您还不知道要在数组中删除的项目的索引。您将需要找到该元素,然后执行转换。在链接列表中,您只需要查找元素并删除指针,就无需移动元素。