从单链表中查找元素(从尾部开始)

时间:2014-02-02 23:28:42

标签: c++ data-structures linked-list

我有一个单独的链表。

例如: 52 - > 79 - > 67 - > 50 - > 16 - > 99 - > 75

如果我想从逆序中获得第3个数字(应该是16),我该怎么办? 该要求不允许我反向列表。

唯一的提示是: 有一种算法只扫描一次链表!一种可能性是使用两个指针扫描列表。

任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:8)

如果k是尾部元素的编号,则创建两个指针:一个指向开始,另一个指向开始+ k。同时增加两者。当第二个到达结尾时,第一个到达你的元素。

答案 1 :(得分:3)

使用两个指针:

Node* kthFromEnd(int k, Node *first) {
  Node *second = first;

  // Advance first k-1 times
  while(first && --k) {
    first = first->next();
  }
  // Now second is k nodes behind first, go to the end
  while(first) {
    first = first->next();
    second = second->next();
  }
  // First is at the end, second is still k nodes behind

  return second;
}

答案 2 :(得分:1)

以下内容

T *first = 0;
T *last  = head;

size_t i = 0;

while ( i < N && last )
{
   ++i;
   last = last->next;
}

if ( i == N )
{
   first = head;

   while ( tail )
   {
      ++tail;
      ++first;
   }
}

return first;

答案 3 :(得分:0)

保持大小为3的circular array,或者更一般地说,大小为k(对于第k个最后一个元素)。

浏览列表,然后只需添加到数组中。完成后,返回数组中的下一个元素。

替代方案是其他答案中建议的两个指针。

示例输入:

52 -> 79 -> 67 -> 50 -> 16 -> 99 -> 75

数组看起来像:

[0, 0, 0]
[52, 0, 0]
[52, 79, 0]
[52, 79, 67]
[50, 79, 67]
[50, 16, 67]
[50, 16, 99]
[75, 16, 99]

然后返回下一个元素 - &gt; 16