所以我试图更好地理解LinkedLists,并且练习告诉我为我编写的链表类添加实现迭代器类的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()
方法是错误的,我使用它是错误的,还是两者都错了?
感谢您的时间!
答案 0 :(得分:1)
问题是curr
没有引用返回的最后一个元素,而是引用要返回的下一个元素。
remove()
旨在删除前者,而您的方法会删除后者。
答案 1 :(得分:0)
为什么不将电流设置为下一个节点。为什么在remove方法中检查null。
答案 2 :(得分: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;
}
}
}
};
}