2013-03-06 71 views
2

所以我想更好地理解LinkedLists,并且练习告诉我为我编写的链表类的迭代器类的方法添加remove()。 我的迭代器类看起来是这样的:LinkedList迭代器类的remove()

public java.util.Iterator<T> iterator() { 
    return new java.util.Iterator<T>() { 
     Node prev= null,curr = head; 

     public boolean hasNext() { 
      if (curr != null) { 
       return true; 
      } 
      return false; 
     } 

     public T next() { 
      T temp = curr.data; 
      prev = curr; 
      curr = curr.next; 
      return temp; 
     } 

     public void remove() { 
      if(prev==null || curr==null) 
       head=head.next; 
      else 
       prev.next=curr.next; 
     } 
    }; 
} 

而且,我写它的测试去有点像这样:

public void testiterator(){ 
    BasicLinkedList<String> basicList = new BasicLinkedList<String>(); 
    basicList.addToFront("Blue").addToEnd("Red").addToFront("Yellow"); 
    for(Iterator<String> i = basicList.iterator(); i.hasNext();){ 
     if(i.next().equals("Blue")) 
      i.remove(); 
    } 
    assertTrue(basicList.toString().equals("\" Yellow Red \"")); 
} 

然而,当,当我打印basicList,它告诉我,该列表包含黄色和蓝色而不是黄色和红色。我是否执行了remove()方法错误,我是否使用了错误,或者两者都有?

感谢您的时间家伙!

回答

1

问题是curr不引用返回的最后一个元素,而是引用下一个要返回的元素。

remove()是为了去除前者,而你的方法去掉后者。

+0

这几乎是加强我的想法发生了什么。我通过添加第三个称为prevOriginal的节点来修复我的代码。当next()被称为prevOriginal = prev之前,任何事情都被设置为下一个。然后在删除我用prevOriginal.next = prev.next正确地移动列表。原油我知道,但我想它的工作原理:\ 谢谢! – CoderNinja 2013-03-06 22:06:00

0

为什么不把电流设置到下一个节点。为什么要在remove方法中检查null。

+0

我想这只是我对迭代器如何工作以及如何使用remove方法缺乏理解的结果。我想我忘记了当.next()被调用时,它转移到下一个,并且删除没有办法记住原始节点是什么。 – CoderNinja 2013-03-06 22:02:26

0

试试这个队友:

public java.util.Iterator<T> iterator() { 
    return new java.util.Iterator<T>() { 
     Node<T> prev = null; 
     Node<T> curr = null; 

     public boolean hasNext() { 
      if (curr == null) { 
       return (head != null); 
      } 
      return (curr.next != null); 
     } 

     public T next() { 
      if (!hasNext()) { 
       return null; 
      } 
      if (curr == null) { 
       curr = head; 
      } else { 
       prev = curr; 
       curr = curr.next; 
      } 
      return curr.data; 
     } 

     public void remove() { 
      if (curr != null) { 
       if (prev != null) { 
        prev.next = curr.next; 
       } else { 
        head = curr.next; 
       } 
      } 
     } 
    }; 
} 
+0

尝试这一点,它没有正确迭代。有一个只是“黄色”的列表,并为(String element:basicList)运行了一个 'System.out.print(element +“”); } ' – CoderNinja 2013-03-06 21:59:19

+0

您可以发布您的代码为这3种方法:'BasicLinkedList'(构造函数),'addToFront'和'addToEnd'? – vikingsteve 2013-03-07 07:45:21