2013-04-11 50 views
0

我正在处理我的OOP类的链接列表赋值,并且遇到了一些使用remove方法的问题。我们的教授要求我们写一个方法:链接列表 - 删除索引处的元素

public Object removeElement(int index) 

这需要一个索引,它是需要移除的元素的位置。它必须返回包含的已删除节点的数据。但是,我在获取方法返回正在移除的对象时遇到了问题。出于某种原因,我不断收到错误,该方法必须返回类型对象的结果。我让它返回一个对象,并且我在各个地方经历了尝试和失败,但都没有成功。 这里是我的代码:

public Object removeElement(int index) 
    { 
    ListIterator iterator = listIterator(); 
    Object object; 
    //If the supplied index is less than zero, throw an exception. 
    if(index < 0) 
    { 
     IndexOutOfBoundsException ex = new IndexOutOfBoundsException(); 
     throw ex; 
    } 

    else 
    { 
     for(int i = 0; i <= index; i++) 
     { 
      if(!iterator.hasNext()) 
      { 
       IndexOutOfBoundsException ex = new IndexOutOfBoundsException(); 
       throw ex; 
      } 
      else 
      { 
       if(i == index) 
       { 
        object = iterator.next(); 
        iterator.remove(); 
        return object; 
       } 
       else 
       { 
        iterator.next(); 

       } 
      } 
     } 
    } 

}

+0

是否错误给行号?什么是完整的错误信息? – iamnotmaynard 2013-04-11 20:46:00

+0

错误不在编译,它是在我编译之前的方法。 – Legare 2013-04-11 20:49:36

+2

@DanielPikul:有效*是*编译错误。这只是你的IDE基本上在你输入时进行编译。 – 2013-04-11 20:50:27

回答

3

你拥有了它,如果i == index返回一个对象。但编译器不知道该循环实际上总是会在那一刻结束。它看着循环的底部,并思考“如果我们到达这里,我们想要返回什么?”

我真的调整你的代码:

if (index < 0) 
{ 
    // No need for a separate variable 
    throw new IndexOutOfBoundsException(); 
} 

// No need for an else block 
ListIterator iterator = listIterator(); 
Object current = null; 
for (int i = 0; i <= index; i++) 
{ 
    // Note: assuming you expose the size(), you could check this up front... 
    if(!iterator.hasNext()) 
    { 
     throw new IndexOutOfBoundsException(); 
    } 
    current = iterator.next(); 
} 
iterator.remove(); 
return current; 

现在你总是呼叫remove并返回当你叫next()给定的次数,因为这是当环路将结束比通过其他一个例外。

+0

那我该如何解决呢?我有方法抛出一个异常,如果它没有达到它,我希望这会照顾它。 – Legare 2013-04-11 20:50:48

+0

好的,我比较真的很快。 – Legare 2013-04-11 20:54:05

+0

太棒了!谢谢!!!我实际上保留了我的代码,并且最初将对象设置为null,并在循环外写了一个返回行。你的代码绝对简单得多,帮助我思考它。 – Legare 2013-04-11 20:59:00

0

请发布listIterator()方法实现和您正在获取的错误消息。 注意:>您必须使用类变量(如整数)来管理列表的大小。所以你没有检查!iterator.hasNext(),而是将索引与当前大小进行比较。

+0

LinkedLists没有存储的大小索引,即ArrayLists。我必须使用hasNext(); – Legare 2013-04-11 20:55:28

+0

LinkedLists没有大小?什么是[this](http://docs.oracle.com/javase/6/docs/api/java/util/LinkedList.html#size())呢? – jahroy 2013-04-11 20:57:47

+0

我们不允许在这堂课中使用。我们正在使用由我们的教授编写的自定义LinkedList子集。我应该澄清一点。 – Legare 2013-04-11 21:00:18

1

首先不要使用java LinkedList中的迭代器,它是Doubly linked list,我想教授想看看你如何实现LikedList数据结构的删除功能。

其次使循环和条件,其中i+1 == index在这个地方,保存当前的元素像Node returnElement = curent.next;回报,并删除操作curent.next = curent.next.next;