【问题标题】:How to delete a node from a linked list如何从链表中删除节点
【发布时间】:2011-10-07 18:41:35
【问题描述】:

嘿,伙计们,我写了这个 deleteNode() 方法,如果我使用 numbers(int),但当我尝试传递一个字符串时,它不起作用。我正在打印一个 String[] 名称列表,我试图从列表中删除某个名称。当我输入名称时,它会打印“找不到节点”。就像我说的,如果我打印出一个数字列表,效果很好,但如果我改变并打印一个字符串,它就不行了。任何帮助表示赞赏。

   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); 
          }

String[] 名称 = {name1, name2, name3, name4}

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

【问题讨论】:

  • 好的,这是大部分代码

标签: java eclipse linked-list nodes


【解决方案1】:

编辑:好的,我发现您发布的示例代码有什么问题。

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

这与BigNode 中的大部分代码无关(尽管这当然可以变得更优雅)。基本上是这样的:

String delete = in.next();

应该是

String delete = in.nextLine();

现在我强烈建议您不要只更改代码,而是想想您自己可以诊断出这种情况的方法:

  • 将日志记录添加到您的代码中以显示您正在寻找的值,以及您测试时的每个值
  • 使用调试器单步调试代码,观察变量
  • 使用单元测试来测试代码 - 那些不会向您显示问题(因为它不在您通常编写测试的代码中)但它们会让您更加确信问题不在测试代码中

如果您尝试这些方法中的一些或最好全部,那么您将从这个问题中学到更多,而不仅仅是如何使用Scanner...


在不同的地方,您使用 == 运算符比较字符串 references。如果您传递对列表中存在的实际字符串对象之一的引用,那只会找到您的节点 - 而不是对 equal 字符串对象的引用。

你想要这样的东西:

if (curr.dataitems.equals(value))

(但仔细检查null)。

【讨论】:

  • @TMan:那么你需要发布一个简短但完整的程序。例如,您还没有向我们展示 BigNode 的代码。
  • 好的,我发布了必要的代码。您认为这可能是我传递要删除的名称的方式吗?
  • @TMan:您发布的代码总是给出 NullPointerException。它甚至从不使用names
  • 是的,很抱歉,b/c x.printNodes(names) 需要在 main 方法中。
  • @TMan:对于一个名为printNodes 的方法将添加 个节点添加 到列表中,这非常 奇怪......而且空列表仍然应该'不要抛出 NullPointerException。不过,我会调查一下...
【解决方案2】:

您应该使用 String.equals 比较而不是 == 比较。

if(curr.dataitems == value) {

应该是:

if(curr.dataitems.equals(value) {

【讨论】:

    【解决方案3】:

    您与== 进行比较。对于int,它比较值,但对于String,仅比较引用。那么您是否想删除具有相同值但在不同对象中的字符串,这将失败。

    请改用String.equals()

    【讨论】:

      【解决方案4】:

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

      curr.dataitems == value
      

      应该写成:

      curr.dataitems.equals(value)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-08
        • 2014-02-27
        • 2020-02-26
        • 1970-01-01
        相关资源
        最近更新 更多