朋友们,我的代码必须从列表中删除某个元素。它必须删除列表中所有的出现项。例如,如果我想删除"3"
,输入是:
1
2
3
4
3
5
则输出应为:
1
2
4
5
但是我的代码只删除元素的最后出现,因为它可以在我运行代码时看到:
3
4
3
2
1
After removing element 3
4
3
2
1
smb可以帮我一下吗?提前感谢!
public void removeElements(String number){
if(isEmpty()){
System.out.println("The list is empty!");
}
else{
if(firstLink.data.equals(number)){
firstLink = firstLink.next;
}
else{
Link current = firstLink.next;
Link previous = firstLink;
while(current != null){
if(current.data.equals(number)){
previous.next = current.next;
break;
}
else{
previous = current;
current = current.next;
}
}
}
}
}
删除元素的循环在第一次匹配时中断。也许下面的方法会更好。当current是匹配时,更新previous。Next但保留previous指向前一个节点,当它不匹配时,更新previous指向当前节点。
while (current != null) {
if (current.data.equals(number)) previous.next = current.next;
else previous = current;
current = current.next;
}
移除break
,你的循环在它第一次进入它之后就中断了。
另一点是,它在你的if(firstLink.data.equals(number))
中下降,完全忽略了else
块。你不应该在else
中有那个块。它应该在外面。
if(firstLink.data.equals(number)){
firstLink = firstLink.next;
}
Link current = firstLink.next;
Link previous = firstLink;
while(current != null){
if(current.data.equals(number)){
previous.next = current.next;
} else {
previous = current;
current = current.next;
}
}
您可以做的是遍历整个循环并检查元素的值是否与搜索值匹配。如果是,那么你可以使用remove这个元素。我不会给出解决方案,但我可以提供算法。
for(int i = 0; i < length of list; i++)
{
if(ith element of the list == value to be removed)
//remove the ith term using .remove(i) method
}
你可以做的是创建一个包含你想从LinkedList中删除的所有值的新集合,然后在列表上调用removeAll:
ArrayList<String> numbersToRemove = new ArrayList<String>();
numbersToRemove.add("3");
list.removeAll(numbersToRemove);
这样,如果你以后想要删除多个数字,你可以把它们添加到numbersToRemove。
其他一些答案更简单,更直接,所以如果它们有意义,就使用它们,比如遍历列表并删除与要删除的元素匹配的任何元素。这样做的唯一问题是,如果您在使用object: list语法迭代列表时修改列表,您将获得ConcurrentModificationException,并且如果您使用索引迭代它,可能会获得索引超出范围异常,因此您可能需要做这样的事情:
while (list.contains("3")) {
ll.remove("3");
}