Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在从`LinkedList'中删除元素`_Java_Linked List_Nodes - Fatal编程技术网

Java 正在从`LinkedList'中删除元素`

Java 正在从`LinkedList'中删除元素`,java,linked-list,nodes,Java,Linked List,Nodes,各位,我的代码必须从列表中删除某个元素。它必须删除列表中出现的所有事件。例如,如果我想删除“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(

各位,我的代码必须从列表中删除某个元素。它必须删除列表中出现的所有事件。例如,如果我想删除
“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;
                    }
                }
            }
        }
    }

移除
中断
,循环第一次进入后即中断

另一点是,它落在
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;
       }
   }

您删除元素的循环在第一次匹配时中断。也许像下面这样的方法会更好。当“当前”是匹配项时,更新“上一个”。下一步,但将“上一个”保持指向上一个节点;当“上一个”不是匹配项时,更新“上一个”以指向当前节点

while (current != null) {
    if (current.data.equals(number)) previous.next = current.next;
    else previous = current;
    current = current.next;
}

您可以做的是迭代整个循环,并检查元素的值是否与搜索的值匹配。如果确实如此,则可以使用删除该元素。我不会给出这个问题的解决方案,但我可以为您提供算法

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     
}
for(int i=0;i
您可以创建一个新集合,其中包含要从LinkedList中删除的所有值,然后调用列表中的removeAll:

ArrayList<String> numbersToRemove = new ArrayList<String>();
numbersToRemove.add("3");

list.removeAll(numbersToRemove);

正如@John Bickers提到的,当它是一个匹配项时,你不应该更新
previous
。实际上,在你的情况下,它处于秒级if条件,而不会阻止else。对不起,@JohnBickers,但是当你说“当当前是一个匹配项时,更新previous.next,但将previous指向上一个节点”时,我真的不明白。我应该如何让
previous
指向
previous
?@John,这是指if语句为真时发生的情况与if语句为假时发生的情况之间的区别。
while (list.contains("3")) {
    ll.remove("3");
}