LinkedList Get方法

我有一个 get 方法为我的单链表,他们工作正常,但我的教练告诉我,他希望我减少代码,因为我有太多的特殊情况。

我有一个 get 方法为我的单链表,他们工作正常,但我的教练告诉我,他希望我减少代码,因为我有太多的特殊情况。

从我写的代码:

public E get(int index) {
    Node<E> f = first;
    // If index is bigger / smaller than Linked List size throw IndexOutOfBounds
    if (index > size || index < 0){
        throw new IndexOutOfBoundsException();
    }
    // Index Less than size and is not the first or last node.
    if (index < size && index > 0) {
        for (int i = 0; i < index; i++) {
            f = f.next;
        }
        return f.getValue();
    }
    // If the Linked List is empty + Index = 0 return null
    if (first == null && index == 0) {
        return null;
    }
    // If Linked List is not empty and index = 0 return first value
    if (index == 0) {
        return first.getValue();
    }
    // If index = end of list
    if (index == size) {
        return last.getValue();
    }
    // Return null if not found.
    return null;
}

所以他告诉我,我投入了太多的思想,只有两种情况需要,如果索引是有效的或无效的;我同意他的观点,所以我试图缩短我的代码:

Node<E> f = first;
// If index is bigger / smaller than Linked List size throw IndexOutOfBounds
if (index > size || index < 0){
    throw new IndexOutOfBoundsException();
}
// Index Less than size and is not the first or last node.
if (index <= size && index >= 0) {
    for (int i = 0; i < index; i++) {
        f = f.next;
    }
}
return f.getValue();

和我的测试用例我使用链表与这些值:

[弗兰克,乔治,乔希,吉姆,玛丽,苏西,约翰,吉姆,达科他,利维,杰克逊,杰夫,沃尔特,马特]

和我的测试用例如下在我的测试类:

System.out.println("Get Method Test ----------------------------");
System.out.println("First Index: " + ll.get(0));
System.out.println("Last Index: " + ll.get(ll.size()));
System.out.println("'Middle' Index: " + ll.get(5));
System.out.println("Empty list with index of 0: " + llempty.get(0));

在试图获取最后一个索引的第二个测试用例中抛出一个NullPointerException

输出:

First Index: Frank
Exception in thread "main" java.lang.NullPointerException

我需要能够证明以下内容:

测试用例:索引为零,列表末尾的索引,列表“中间”的索引,索引为 0 的空列表,索引太大,索引太小

所以我被困在这里的家伙 / 女孩,任何帮助将不胜感激!

1

您的代码中有两个相同错误的实例。您必须了解 index 是零相对的,这意味着 sizen列表中的最后一个元素将具有 indexn-1。第一个错误是在您的新get()方法中:

// If index is bigger / smaller than Linked List size throw IndexOutOfBounds
if (index > size || index < 0){
    throw new IndexOutOfBoundsException();
}

在这里,您应该检查index >= size,如下所示:

// If index is bigger / smaller than Linked List size throw IndexOutOfBounds
if (index >= size || index < 0){
    throw new IndexOutOfBoundsException();
}

第二个错误是在你的测试代码。

System.out.println("Last Index: " + ll.get(ll.size()));

您应该使用ll.size() - 1如下:

System.out.println("Last Index: " + ll.get(ll.size() - 1));

这两件事都被其他人观察到了。然而,有必要同时解决它们。

当我进行这些更改并运行您的测试时,它到达了最后一行,并按预期抛出了IndexOutOfBoundsException。我还测试了“Index Too Small”和“Index Too Big”,并得到了IndexOutOfBoundsException

1

我只是让你的代码更简单(第二个if在你的循环是不需要的):

//assume 0 based index
int current = 0;
//loop until we hit the requested index
while (current != index) {
 f = f.next;
 current++;
}
//return the right node
return f;

假设你的初始检查索引出界是正确的,这应该永远不会给你一个问题。但是,如果你的索引是基于 0,你需要改变你的出界检查:

if (index > size - 1 || index < 0) {

例如,如果有 2 个元素,则索引为 0 和 1。在这种情况下,索引 2 无效。

0

这可能不是唯一的原因 (你只向我们展示了部分代码),但是你弄乱了 'size' 值,因为如果索引从 0 开始 (像往常一样),最后一个元素应该在

index == size -1
0

应该是

if (index >= size || index < 0){
        throw new IndexOutOfBoundsException();
    }
if (index < size && index >= 0) {
    for (int i = 0; i < index; i++) {
        f = f.next;
    }
}

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(768)
AzureADDS和漫游配置文件
上一篇
如何快速连续安装IIS服务器和托管包 而不会遇到错误
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(35条)