我最近参加了微软面试。
我被要求用100万个节点实现链表?你将如何访问999999th节点?
这个问题的最佳设计策略和实施是什么?
答案 0 :(得分:13)
链接列表的变化相当少,因为很多变化意味着它不是链接列表。
您可以通过单链接或双链接来改变它。单链接是你有一个指向头部的指针(第一个节点,一个说),它指向B指向C等。要将其转换为双链表,你还要添加一个从C到B和B的链接。到A。
如果你有一个双链表,那么保留指向列表尾(最后一个节点)和头的指针是有意义的,这意味着访问最后一个元素是便宜的,而接近结尾的元素更便宜,因为你可以向前或向前工作......但是......你需要知道你想要的是在列表的最后......并且在一天结束时,链表仍然只是那个,如果它是由于其用例的性质而变得非常大并且这是一个问题,因此应该选择除链表之外的存储结构。
你当然可以杂交你的链接列表,所以你可以索引它或者其他东西,例如理论上没有错,但如果你索引所有节点,那么链表性质不再有多大价值,如果你只索引一些,那么索引节点之间的节点必须进行排序或者某种东西,这样你就可以找到一个关闭节点并朝向目标节点工作......可能这永远不会是最优的,应该选择更好的数据结构
当你不想做某个特定节点之类的事情但是想要不管迭代节点时,都应该使用一个链表。
答案 1 :(得分:3)
我不知道我要说些什么,但是,这里有:
你可以conceptually
拆分sqrt(1000000)
块中的列表,这样你就可以拥有"引用指针"每1000个元素。
将其视为1000 linked lists
每个1000 elements
代表您的1000000 elements
列表。
这是我想到的!
答案 2 :(得分:1)
正如迈克尔所说,你应该首先介绍链表的两个经典变体。接下来你要做的就是询问插入,搜索和删除模式。
这些模式将指导您更好地适应数据结构,因为 nobody 需要一个包含一百万个节点的简单链表或双链表。