查找单链列表的第k个最后一个元素:答案说明

时间:2019-04-07 03:41:19

标签: algorithm linked-list singly-linked-list

当您需要查找单行列表的最后k个元素时,通常的幼稚方法是执行两次遍历。第一个找到列表的长度,第二个迭代直到(length-k)th元素。

优化版本利用了两个指针:

  • p1是指列表的开头
  • p2k之前第p1个元素

这使我们可以在p1到达列表末尾时返回p2的元素。 我不明白为什么在两种情况下我们都有一个指针遍历整个列表,然后又遍历另一个指针直到(length-k)th元素时,第二种方法比第一种更快。

是由于缓存优化吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

如果将p2的{​​{1}}个元素紧紧放在k后面,那么这并没有太大帮助,因为您必须一起进行相同数量的遍历。

不过,您可以通过使用更多的指针来优化过程。

当您遍历列表时,可以说您记得在每个(k / m)位置的某个 m 处的指针。您只需要记住这些指针的最后一个 m + 1 即可。然后,当您到达列表的末尾时,而不是从头开始再次进行迭代,而是从您记住的最早的指针开始。它位于末尾的 k k +(k / m)元素之间,因此您只需将其最多向前移动 k / m < / em>职位。

答案 1 :(得分:1)

考虑不均匀的内存访问时间和长度为 n 单链列表
-在计数迭代方法中,对同一节点的访问将 n 次访问
-在滞后指针方法中,对同一节点的访问将 k 分开访问
使用LRU缓存(/每个LRU缓存 level ),前者比后者更容易诱发capacity misses