LinkedList获取方法

时间:2016-04-23 12:40:14

标签: java linked-list

我有一个单独链接列表的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();

对于我的测试用例,我正在使用带有这些值的链接列表:

  

[Frank,George,Josh,Jim,Marry,Susie,John,Jim,Dakota,Levi,   Jackson,Jeff,Walt,Matt]

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

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的空列表,索引太大,索引太小

所以我被困在这里的家伙/女孩们,任何帮助都会受到赞赏!

4 个答案:

答案 0 :(得分: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无效。

答案 1 :(得分:0)

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

index == size -1

答案 2 :(得分:0)

应该是

if (index >= size || index < 0){
        throw new IndexOutOfBoundsException();
    }

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

答案 3 :(得分:0)

您的代码中有两个同样错误的实例。您必须了解索引是零相对的,这意味着大小为n的列表中的最后一个元素将具有索引n-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。我还测试了#34;索引太小&#34;和&#34;索引太大&#34;得到了IndexOutOfBoundsException