【问题标题】:Retrieving an element by index in Java linked list在Java链表中按索引检索元素
【发布时间】:2017-09-07 22:48:45
【问题描述】:

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

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 的元素。我感谢任何有关这些遍历方法可能存在问题的意见。我有点迷路了。如果我的格式已关闭,也很抱歉,仍然习惯于在此站点上进行格式设置。

【问题讨论】:

  • 请注意,您的边界检查(例如if (index &gt; numElts) {)应该在循环之前,因为它们不会改变循环体内的值。
  • @AndyTurner 甚至不需要内部边界检查,因为它们只是迭代到&lt; this.size()
  • @billie 是的,但是如果您知道一开始就超出范围,为什么还要麻烦迭代整个列表呢?

标签: java for-loop while-loop linked-list traversal


【解决方案1】:

您将curr 初始化为sentinal.next,这不会导致您跳过第一个元素吗?您还应该对每个元素都有一个错误,就好像您的列表是 1-indexed 而不是 0-indexed。

在 while 循环中,除非 i 等于索引,否则您不会迭代 i,因此除非 index 为 0,否则您将永远找不到 i == index 的情况。

【讨论】:

  • 哨兵通常用作位于数据结构的第一个和最后一个元素之前和之后的元素,以简化逻辑而不必使用如此多的空检查。假设它的一部分设置正确,那么起始的 sentinel.next 应该是 0 索引元素。
  • 我认为这是唯一可能出现错误的地方,因为如果 index 为 0,for 循环将中断并在第 7 行返回。除非我遗漏了什么。
  • 我认为你是对的,这让我觉得无论是设置还是解释数据都是错误的。
  • @billie,是的,第一个 sentinel.next 应该引用索引 0 处的元素。我的印象是我编写的代码确实如此(在 for 循环的开头, curr 指的是索引 0 处的元素)。如果我错了,请告诉我。谢谢!
  • 我也收到了关于我的 for 循环的反馈“您可能会考虑在 sentinel.next 节点而不是从 sentinel 开始循环。如果长度为 1,则 sentinel.next 是一个真正的节点,不为空。然后你跳过哨兵并可以计算数据单元节点“我相信这就是我正在做的——我从节点 curr = this.sentinel.next 开始,它对应于索引 0。那将跳过哨兵和只计算节点。所以我很不知道可能是什么问题
猜你喜欢
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 2021-02-19
  • 1970-01-01
  • 2020-01-02
相关资源
最近更新 更多