为什么我的链表的头节点没有被删除?

Why isn't the head node of my linked list being deleted?

好的,所以我正在玩 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 成为新的头。下面是整个实现只是 incase

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

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

这段代码执行:

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

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

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

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

如果需要,您还可以将return类型更改为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;
}