如何从链表中删除节点



嘿,伙计们,我写了这个deleteNode()方法,如果我使用数字(int),但不当我试图传递一个字符串。我正在打印一个String[]列表,我试图从列表中删除一个特定的名字。当我输入一个名称时,它打印"Node not found"。就像我说的,如果我打印出一个数字列表,它工作得很好,但如果我改变并打印一个字符串,它不会。任何帮助都是感激的。

   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[] names = {name1, name2, name3, nam4}

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

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

您正在呼叫Scanner.next(),它读取单个单词。所有的节点值都是两个字。所以如果我输入"Sally Mae"它实际上是只是寻找"Sally"。

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

String delete = in.next();
应该

String delete = in.nextLine();

现在我强烈建议你不要只是修改代码,而是考虑一下你可以自己诊断这个问题的方法:

  • 在代码中添加日志记录,以显示您正在寻找的值,以及您测试过的每个值
  • 使用调试器逐步执行代码,观察变量
  • 使用单元测试来测试代码——这些测试不会显示出问题(因为它不在您通常编写测试的代码中),但它们会给您更大的信心,使问题不在测试代码中

如果你尝试了这些方法中的一些或最好是所有,你将从这个问题中学到的不仅仅是如何使用Scanner


在不同的地方,通过使用==操作符比较字符串引用。只有在传递对列表中存在的实际字符串对象之一的引用时,才会找到您的节点-而不是对相等的字符串对象的引用。

你想要这样的:

if (curr.dataitems.equals(value))

(但仔细检查null)。

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

if(curr.dataitems == value) {
应:

if(curr.dataitems.equals(value) {

==进行比较。对于int,这比较值,但对于String,这只比较引用。所以如果你想删除具有相同值但在不同对象中的字符串,这将失败。

String.equals()代替

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

curr.dataitems == value

应该写成:

curr.dataitems.equals(value)

相关内容

  • 没有找到相关文章

最新更新