伙计们,我的代码必须从列表中删除某个元素。它必须删除列表中的所有出现。例如,如果我想删除"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;
}
}
}
}
}
答案 0 :(得分:2)
你在第一场比赛中删除元素的循环正在中断。也许像下面这样的东西会更好。当current是匹配时,更新previous.next但是先前指向前一个节点,当它不匹配时,更新previous以指向当前节点。
while (current != null) {
if (current.data.equals(number)) previous.next = current.next;
else previous = current;
current = current.next;
}
答案 1 :(得分:0)
删除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;
}
}
答案 2 :(得分:0)
您可以做的是遍历整个循环并检查元素的值是否与搜索到的值匹配。如果是,那么您可以使用删除该元素。我不会放弃解决方案,但我可以为你提供算法。
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
}
答案 3 :(得分:0)
您可以做的是创建一个包含要从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");
}