Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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 给定一个元素,如何删除具有给定元素值的所有节点?_Java - Fatal编程技术网

Java 给定一个元素,如何删除具有给定元素值的所有节点?

Java 给定一个元素,如何删除具有给定元素值的所有节点?,java,Java,好的,我有一个节点类,其中一些字段被定义为值(val)的整数和引用的节点。另外,我还有一个名为listaArmada的第二个类,它有一个节点头字段,指示列表的开头。我创建了一个名为borrarEle的方法类,它接收一个创建的列表,其中包含一些随机值和一个整数。该方法必须在列表中搜索具有给定元素值的节点,并删除包含该元素的所有节点。它可以工作,但只删除找到的第一个元素,而不删除其他元素。无论位置如何,都应该能够删除包含该元素的任何节点 名单:9,1,2,12,14,2,7,7,1,10 要消除的值

好的,我有一个节点类,其中一些字段被定义为值(val)的整数和引用的节点。另外,我还有一个名为listaArmada的第二个类,它有一个节点头字段,指示列表的开头。我创建了一个名为borrarEle的方法类,它接收一个创建的列表,其中包含一些随机值和一个整数。该方法必须在列表中搜索具有给定元素值的节点,并删除包含该元素的所有节点。它可以工作,但只删除找到的第一个元素,而不删除其他元素。无论位置如何,都应该能够删除包含该元素的任何节点

名单:9,1,2,12,14,2,7,7,1,10

要消除的值:7

预计产量:9,1,2,12,14,2,1,10

实际产出:9,1,2,12,14,2,7,1,10

-------节点类

public class Nodo {
int val;
Nodo siguiente;

public Nodo(int ob, Nodo nxt){
    this.val = ob;
    this.siguiente = nxt;
  }
}
-------------------------------二等舱

public class listaArmada {

static public Nodo head;
static public int size;

static void borrarEle(int n, listaArmada ls){

    Nodo anterior = null;
    if(ls.head.val == n){//EL ELEMENTO ESTÁ EN LA CABEZA
        ls.head = ls.head.siguiente;
    }else{
        Nodo temp = ls.head;
        while(temp.siguiente.val != n){
            temp = temp.siguiente;

        }
        Nodo sg = temp.siguiente.siguiente;
        temp.siguiente = sg;
    }
}

您问题中的代码不是MRE,因此在下面的代码中,我添加到您的代码中以创建MRE。基本上,class
ListaArmada
是一个类,其中列表中的每个节点都是class
Nodo
的实例

首先,我在类
ListaArmada
中添加了方法
append()
,以便能够创建一个列表。其次,我重写了
ListaArmada
Nodo
类中的方法
toString()
,以便于测试和调试

我使用了您在问题中提供的样本数据。还有,我用过和

公共类ListaArmada{
公众野头;
公共无效附加(int val){
Nodo n=新的Nodo(val,null);
if(head==null){
水头=n;
}
否则{
Nodo next=head.getSiguiente();
Nodo prev=头部;
while(下一步!=null){
上一个=下一个;
next=next.getSiguiente();
}
上一个设置界面(n);
}
}
博拉雷勒公共区(国际北){
if(head!=null){
Nodo curr=头部;
Nodo prev=头部;
while(curr!=null){
if(curr.getVal()==n){
上一个setSiguiente(curr.getSiguiente());
如果(当前==水头){
head=curr.getSiguiente();
}
}
否则{
上一次=当前;
}
curr=curr.getSiguiente();
}
}
}
公共字符串toString(){
StringBuilder sb=新的StringBuilder();
Nodo curr=头部;
while(curr!=null){
某人追加(货币);
curr=curr.getSiguiente();
}
某人附加(“结束”);
使某人返回字符串();
}
公共静态void main(字符串[]args){
ListaArmada la=新ListaArmada();
la.追加(9);
la.追加(1);
la.追加(2);
la.追加(12);
la.追加(14);
la.追加(2);
la.追加(7);
la.追加(7);
la.追加(1);
la.追加(10);
系统输出打印LN(la);
拉博雷莱(7);
系统输出打印LN(la);
}
}
野藤班{
私人国际旅行社;
私人的诺多·西吉恩特;
公共Nodo(内部ob、Nodo nxt){
this.val=ob;
this.siguiente=nxt;
}
公共int getVal(){
返回val;
}
公共Nodo getSiguiente(){
返回信号;
}
公共无效设置标识符(Nodo n){
siguiente=n;
}
@凌驾
公共字符串toString(){
返回字符串。格式(“%d->”,val);
}
}
append()

borrarEle()
方法中的
while
循环是错误的。您希望遍历列表中的所有节点。当列表中的
siguiente
为空时,您知道已到达列表中的最后一个节点。您还需要处理删除列表中第一个节点的情况。在这种情况下,您还必须在类
ListaArmada
中更新
head

运行上述代码将生成以下输出

9 -> 1 -> 2 -> 12 -> 14 -> 2 -> 7 -> 7 -> 1 -> 10 -> END
9 -> 1 -> 2 -> 12 -> 14 -> 2 -> 1 -> 10 -> END

您的代码仅从列表中删除一个节点。即使删除了一个节点,也需要一个循环来继续查看其余节点。这也适用于head节点,因为您的代码现在也会得到类似于7,7,1的列表的错误结果。