【问题标题】:Why isn't the head node of my linked list being deleted?为什么我的链表的头节点没有被删除?
【发布时间】:2015-05-02 01:45:59
【问题描述】:

好的,所以我正在使用 Java 中的链表。我试图理解为什么我的 deleteNode 方法不删除头节点。它适用于其他节点。

方法如下

Node deleteNode(Node head, int d){
        Node n = head;
        if(n.data == d){
            return head.next;
        }

        while(n.next != null){
            if(n.next.data == d){
                n.next = n.next.next;
                return head;
            }
            n = n.next;
        }
        return head;
    }

示例输入:

Node ll = new Node(1);
ll.appendToTail(2);
ll.appendToTail(3);

当我调用我的方法时

ll.deleteNode(ll, 2);

然后打印当前节点,我得到正确的输出1->3,但是当我使用该方法删除初始节点或头部时

ll.deleteNode(ll, 1);

我得到输出 1->2->3,但我期望 2->3,其中 2 成为新的头。下面是整个实现,以防万一

public class Node {

    Node next = null;
    int data;

    public Node(int d){
        data = d;
    }

    void appendToTail(int d){

        Node end = new Node(d); //Item to append to the end
        Node n = this; //To access Class object next

        while(n.next != null){
            n = n.next;
        }
        n.next = end;
    }

    Node deleteNode(Node head, int d){
        Node n = head;
        if(n.data == d){
            return head.next;
        }

        while(n.next != null){
            if(n.next.data == d){
                n.next = n.next.next;
                return head;
            }
            n = n.next;
        }
        return head;
    }

    void printNodes(){ 
        Node n = this;
        while(n.next != null){
            System.out.println(n.data);
            n = n.next;     
        }
        System.out.println(n.data); //print out the last node
    }

    //For fun, to simulate how python print's a list
    // printed example [1, 2, 3]
    void listNodes(){
        Node n = this;
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        while(n.next != null){
            sb.append(n.data).append(", ");
            n = n.next;
        }
        sb.append(n.data);
        sb.append("]");
        System.out.println(sb.toString());
    }
}

【问题讨论】:

    标签: java linked-list


    【解决方案1】:

    根据你写的函数,你应该像ll = ll.deleteNode(ll, 1)一样使用它。

    此外,您不需要使用head 参数,因为this 已经是head。

    如果需要,还可以将返回类型更改为void,将return head.next替换为data = head.next.data; next = head.next.next,将return head;替换为return;;那么你就可以像你想要的那样调用它了。

    这里是完整的方法:

    void deleteNode(int d){
        Node n = this;
        if(n.data == d){
            data = next.data;
            next = next.next;
            return;
        }
    
        while(n.next != null){
            if(n.next.data == d){
                n.next = n.next.next;
                return;
            }
            n = n.next;
        }
        return;
    }
    

    【讨论】:

    • 谢谢,这正是我想要的。
    【解决方案2】:

    当您调用deleteNode() 删除列表的头部时,该方法不执行任何操作。

    这段代码执行:

        Node n = head;
        if(n.data == d){
            return head.next;
        }
    

    它返回头节点的.next 字段,但不修改任何内容——因此它不能删除任何内容。当您调用 deleteNode() 获取除 head 以外的任何内容时,您将到达 while 循环并实际修改列表。

    【讨论】:

    • 哦..我以为它会将当前头部分配给列表中的下一个对象。
    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2015-12-10
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多