当前位置: 首页 > 知识库问答 >
问题:

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

司寇阳朔
2023-03-14

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

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

  • p1引用列表的头部
  • p2kp1
  • 之前的第2个元素

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

这是因为缓存优化吗?

谢谢

共有2个答案

柳德义
2023-03-14

考虑非均匀的内存访问时间和长度为n的单链表:
-在计数迭代方法中,对同一节点的访问将是n次访问间隔
-在滞后指针方法中,对同一节点的访问将是k次访问间隔
对于LRU缓存(/每个LRU缓存级别),前者比后者更有可能导致容量缺失。

耿和韵
2023-03-14

如果您将p2完全k元素保留在p1后面,那么它实际上没有多大帮助,因为您必须一起执行相同数量的遍历。

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

当你浏览列表时,假设你记住了每个(k/m)位置的指针,对于一些m,你只需要记住这些指针中最后的m1。然后,当您到达列表的末尾时,不要从头开始重复,而是从您记得的最早的指针开始。它将在末端后面的k和k(k/m)元素之间,因此您只需将其向前移动最多k/m个位置。

 类似资料:
  • 在单链表中,我们知道最后一个节点的下一个指向,这样我们就可以通过遍历找到它。 如果单链表的最后一个节点指向某个中间节点,那么我们如何找到最后一个节点?

  • [采访问题] 编写一个函数,该函数将在一次传递中从单个链表整数的尾部(或尾部)返回第5个元素,然后提供一组针对该函数的测试用例。 这类似于问题:如何从单链表的末尾找到第n个元素?,但是我还有一个额外的要求,我们应该只遍历链接列表一次。 这是我的解决方案: 我只遍历链表一次,并使用隐式递归堆栈。另一种方法是有两个指针:快指针和慢指针,快指针是比慢指针快的k个指针。哪一个看起来更好?我认为有两个指针的

  • 当单击的elemenet是父元素的最后一个子元素时,我要显示报警。我的HTML结构: 在本例中,我希望在单击该元素(父行的最后一个元素)时显示报警: 我知道我可以使用这样的somethink获得最后一个元素(但我不能在我的例子中使用这个): 我想试着做这样的事,但每次都是假的

  • 我有一个列表[z”,“1”,“3”,“x”,“y”,“00”,“x”,“y”,“4”],在这种情况下,我需要得到字符串后的第一个

  • 这是一个面试问题。 在排序的行(但不是排序的列)和行之间没有关系的矩阵中查找第k个最小元素。(第一行和第n行之间没有关系——我们只知道每一行都是按升序排列的) 输入示例如下: 这种情况下的结果是 因为20是这个矩阵中第五小的元素。 我首先想到将所有元素添加到minHeap中,然后轮询元素,同时每次迭代从k中减去一个,直到我们得到答案。我还考虑为O(m*n)解决方案实现快速选择,尽管这些解决方案并没

  • 为了好玩/Java实践,我做了以下问题: 编写一个方法,该方法将整数的优先级队列作为输入,并输出最小整数。该方法不应更改传入的优先级队列的内部状态。您只能使用一个队列或堆栈作为额外数据。不允许使用其他数据结构<代码>k为1索引(表示最小值)。 获取元素很简单:只需删除次,因为它是优先级队列。我想我可以弹出,将元素放在堆栈上进行存储,然后在完成后将它们添加回队列。不过这不起作用,因为元素在优先级队列