Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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_Eclipse_Linked List_Nodes - Fatal编程技术网

Java 如何从链接列表中删除节点

Java 如何从链接列表中删除节点,java,eclipse,linked-list,nodes,Java,Eclipse,Linked List,Nodes,嘿,伙计们,我写了这个deleteNode()方法,如果我使用数字(int),它可以工作,但是当我尝试传递字符串时,它就不能工作。我正在打印一个字符串[]名称列表,并试图从列表中删除某个名称。当我输入名称时,它会打印“未找到节点”。就像我说的,如果我打印出一个数字列表,效果会很好,但是如果我改成打印一个字符串,效果就不好了。感谢您的帮助 public class BigNode { public String dataitems; public BigNode next

嘿,伙计们,我写了这个deleteNode()方法,如果我使用数字(int),它可以工作,但是当我尝试传递字符串时,它就不能工作。我正在打印一个字符串[]名称列表,并试图从列表中删除某个名称。当我输入名称时,它会打印“未找到节点”。就像我说的,如果我打印出一个数字列表,效果会很好,但是如果我改成打印一个字符串,效果就不好了。感谢您的帮助

   public class BigNode {


   public String dataitems; 
    public BigNode next; 
    BigNode front ;

    public void initList(){
        front = null;
    }

    public BigNode makeNode(String number){
        BigNode newNode;
        newNode = new BigNode();
        newNode.dataitems = number;
        newNode.next = null;
        return newNode;
    }

    public boolean isListEmpty(BigNode front){
        boolean balance;
        if (front == null){
            balance = true;
        }
        else {
            balance = false;
        }
        return balance;

    }

    public BigNode findTail(BigNode front) {
        BigNode current;
        current = front;
        while(current.next != null){
            //System.out.print(current.dataitems);
            current = current.next;

        } //System.out.println(current.dataitems);
        return current;
    }

    public void addNode(BigNode front ,String number){
        BigNode tail;
        if(isListEmpty(front)){
            this.front = makeNode(number);
        } 
        else {
            tail = findTail(front);
            tail.next = makeNode(number);
        }
    }
    public void deleteNode(BigNode front, String value) {
        BigNode curr, previous = null; boolean found; 

            if (!isListEmpty(front)){
                curr = front;
                found = false;

                while ((curr.next != null) && (!found)) {
                    if(curr.dataitems.equals(value)) {
                        found = true;
                    } 
                    else {
                        previous = curr;
                        curr = curr.next;
                    }
                }
                if (!found) {
                    if(curr.dataitems.equals(value)) {
                        found = true;
                    }
                }
                if (found) {
                    if (curr.dataitems.equals(front.dataitems)){ // front.dataitems may be wrong .dataitems 
                        front = curr.next;
                    } else { 

                        previous.next = curr.next;
                    }
                } else {
                    System.out.println("Node not found!");
                    //curr.next = null; // Not sure If this is needed
                }
        } 
            showList(front);
    }




    public void printNodes(String[] len){


        int j;
        for (j = 0; j < len.length; j++){

            addNode(front, len[j]);
        }  showList(front);
    }

    public void showList(BigNode front){
        BigNode current;
        current = front;
        while ( current.next != null){
            System.out.print(current.dataitems + ", ");
            current = current.next;
        }
        System.out.println(current.dataitems);
    }
    public static void main(String[] args) {
                   String[] names = {"Billy Joe", "Sally Mae", "Joe Blow", "Tasha Blue"}; 

        BigNode x = new BigNode(); 
                   x.printNodes(names); 
                   Scanner in = new Scanner(System.in);
                   String delete = in.next();
                  x.deleteNode(x.front, delete); 
          }
公共类BigNode{
公共字符串数据项;
公共大节点下一步;
大节点锋;
public void initList(){
front=null;
}
公共BigNode makeNode(字符串编号){
大节点新节点;
newNode=newbignode();
newNode.dataitems=编号;
newNode.next=null;
返回newNode;
}
公共布尔值isListEmpty(BigNode前端){
布尔平衡;
if(front==null){
平衡=正确;
}
否则{
平衡=假;
}
收益余额;
}
公共BigNode findTail(BigNode前端){
大节点电流;
电流=前沿;
while(current.next!=null){
//系统输出打印(当前数据项);
当前=当前。下一步;
}//System.out.println(current.dataitems);
回流;
}
public void addNode(BigNode前面,字符串编号){
大节尾;
如果(isListEmpty(前)){
this.front=makeNode(编号);
} 
否则{
尾部=尾翼(前部);
tail.next=makeNode(编号);
}
}
公共void deleteNode(BigNode前端,字符串值){
BigNode curr,previous=null;找到布尔值;
如果(!isListEmpty(前)){
curr=正面;
发现=错误;
while((curr.next!=null)&&(!found)){
if(当前数据项等于(值)){
发现=真;
} 
否则{
先前=当前;
curr=curr.next;
}
}
如果(!找到){
if(当前数据项等于(值)){
发现=真;
}
}
如果(找到){
如果(curr.dataitems.equals(front.dataitems)){//front.dataitems可能错误。dataitems
前=当前下一个;
}否则{
previous.next=curr.next;
}
}否则{
System.out.println(“未找到节点!”);
//curr.next=null;//不确定是否需要
}
} 
展示名单(前);
}
公共void打印节点(字符串[]len){
int j;
对于(j=0;j
字符串[]名称={name1,name2,name3,name4}


-首先它打印列表,然后询问要删除的名称。

您应该始终使用equals()来比较对象值,而不是==。例如,在代码中,这一行:

curr.dataitems == value
应写为:

curr.dataitems.equals(value)

您应该始终使用equals()来比较对象值,而不是==。例如,在代码中,这一行:

curr.dataitems == value
应写为:

curr.dataitems.equals(value)

编辑:好的,我已经发现你发布的示例代码有什么问题

您正在调用Scanner.next()
,它读取一个单词。您所有的节点值都是两个单词。因此,如果我键入“Sally Mae”,它实际上只是在查找“Sally”

这与
BigNode
中的大多数代码无关(尽管这肯定会变得更加优雅)。基本上:

String delete = in.next();
应该是

String delete = in.nextLine();
现在,我强烈建议您不要只是更改代码,而是想想您可以自己诊断的方法:

  • 在代码中添加日志记录,以显示您正在寻找的值,以及测试时的每个值
  • 使用调试器单步执行代码,观察变量
  • 使用单元测试来测试代码——这些测试不会向您显示问题(因为它不在您通常编写测试的代码中),但它们会让您更加确信问题不在测试的代码中
如果您尝试一些或更喜欢所有这些方法,您将从这个问题中学到更多,而不仅仅是如何使用
Scanner


在不同的地方,您使用==运算符来比较字符串引用。只有当您传入对列表中实际字符串对象之一的引用,而不是对相等字符串对象的引用时,才会找到节点

你想要的是:

if (curr.dataitems.equals(value))

(但要仔细检查
null

编辑:好的,我发现了您发布的示例代码的错误

您正在调用Scanner.next(),它读取一个单词。您所有的节点值都是两个单词。因此,如果我键入“Sally Mae”,它实际上只是在查找“Sally”

这与
BigNode
中的大多数代码无关(尽管这肯定会变得更加优雅)。基本上:

String delete = in.next();
应该是

String delete = in.nextLine();