在Java链接列表中按索引检索元素

问题描述:

我正在编写一个链接列表(不使用Java的)并尝试创建一个get方法以通过其索引号返回列表元素。最初,我使用for循环写了这个。我的代码重复失败了一个测试,它在索引0处检索元素(我似乎能够在其他索引处检索元素)。 curr只是为了跟踪当前节点。在Java链接列表中按索引检索元素

public double get(int index) { 
    Node curr = this.sentinel.next; 

    for (int i = 0; i < this.size(); i++) { 
     if (i == index) { 
      return curr.data; 
     } 
     curr = curr.next; 
     if (index > numElts) { 
      return Double.NaN; 
     } 
     if (index < 0) { 
      return Double.NaN; 
     } 
    } 
    return Double.NaN; 
} 

我认为for循环可能是给我麻烦的,所以我把它写成while循环。

while (curr != null) { 
    if (i == index) { 
    i++; 
    return curr.data; 
} 
curr = curr.next; 
} 

但是,我仍然无法检索0索引处的元素。我很感激任何关于这些遍历方法如何可能存在问题的意见。我有点迷路。如果我的格式已关闭,也很抱歉,仍然习惯于在此网站上进行格式设置。

+0

请注意,您的边界检查(如:'如果( index> numElts){')应该在循环之前,因为它们不会改变循环体内的值。 –

+0

@AndyTurner内部边界检查甚至不必要,因为它们只是迭代到' billie

+0

@billie是真的,但如果你知道它开始时出现了界限,为什么还要重复整个列表呢? –

您正在初始化currsentinal.next,这不会导致您跳过第一个元素吗?你也应该对每个元素都有一个错误的错误,就好像你的列表是1索引而不是0索引的。

在while循环,你不迭代i,除非它是等于索引,所以你永远也找不到的情况下i == index除非index为0

+0

Sentinals通常用作位于数据结构的第一个和最后一个元素之前和之后的元素,以简化逻辑,而不必使用如此多的空检查。假设它的一部分设置正确,那么起始sentinel.next应该是0索引元素。 – billie

+0

我认为这是错误的唯一出处,因为如果'index'为0,for循环会在第7行中断并返回。除非我错过了某些东西。 – Bricky

+0

我认为你是对的,这使我认为这是设置或解释数据时的错误。 – billie