【问题标题】:Find element at position sqrt(n) in linked list in one iteration在一次迭代中查找链表中位置 sqrt(n) 处的元素
【发布时间】:2019-10-18 01:38:55
【问题描述】:

如何在链表中查找位置 sqrt(n) 处的元素,其中 n 是一次迭代中链表中的元素数?在开始之前,我们不知道列表的大小。

【问题讨论】:

  • 这听起来像是一个家庭作业问题。是吗?
  • 迭代前你知道列表的大小吗?
  • @MooingDuck 不,我们不知道尺寸
  • 这里的“一次迭代”究竟是什么意思?如果一个迭代器完全迭代而第二个迭代器只部分迭代,可以吗?或者每个项目只能从一次迭代?是否允许使用外部数据结构?

标签: data-structures linked-list


【解决方案1】:

您可以使用类似于Tortoise and hare algorithm 的方法来检测链表中的循环。具体来说,以快指针FP 和慢指针SP 从列表的开头开始。然后反复,

  • SP 前进了一步
  • FP 逐步推进更多步骤:1,然后 3,然后 5,然后 7...

关键是 1 + 3 + 5 + 7 + ...(N 个术语)是 N²。因此,在 N 次重复之后,SP 将位于位置 N 而 FP 将位于位置 N² 。每当 FP 到达链表的末尾时,SP 就持有答案。

【讨论】:

  • 迭代不止一次
  • 我将“迭代”改写为“重复”以澄清我不使用与 OP 具​​有相同含义的“迭代”。这里有一个循环,显然必须有一个,但是访问的元素总数是L(来自FP)加上sqrt(L)(来自SP),其中L是列表长度未知。
【解决方案2】:

最简单的解决方案:

int sqrth(node* head)
{
    node* temp1=head;
    node* temp2=head;
    int k=1;
    while(1)
    {
        int l=k*k;
        int r=(k+1)*(k+1)-1;

        for(int i=l;temp1->next&&i<r;i++)// e.g. when k=2  range[4,7] return 
        temp1=temp1->next;

        if(!temp1->next)
        return temp2->data;

        temp2=temp2->next;
        temp1=temp1->next;

        k++;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多