为什么将新节点添加到链表前面在我的代码中不起作用?

Why does adding a new node to front of linked list NOT work in my code?

为什么我不能如下插入一个新节点到我的链表中?我的 insertNodeToHead 仅在我的 return 类型本身是节点并且我 return root 时才有效。但是我希望能够在不 returning 任何东西的情况下更改链表本身。目前,它应该打印 0,1,2,3,4,但只打印 1,2,3,4。

这是我的代码:

// Create a singly linked list class
public class Node {
    int data;
    Node next = null;

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

    // insert a node to the head of a linked list
    public void insertNodeToHead (Node n) {
        Node root = this;
        n.next = root;
        root = n;
        return;

    }


    public static void main(String[] args) {
        Node root = new Node(1);
        root.next = new Node(2);
        root.next.next = new Node(3);
        root.next.next.next = new Node(4);

        // insert new node
        Node insertNew = new Node(0);
        root.insertNodeToHead(insertNew);

        Node current = root;
        while (current != null) {
            System.out.println(current.data); 
            current = current.next;
        }
    }
}

那么,您的 insertNodeToHead() 方法所做的就是将当前 root 节点附加为 insertNew 节点的 next 节点。执行 root = n; 在方法之外没有任何效果,因为它只是一个 local 变量。

现在,从技术上讲,新节点已成为列表的根,但您看不到它,因为您仍在从旧 root 节点(即列表的第二个节点)迭代列表现在 0 位于头部。

您需要引入另一个 class,比如 SinglyLinkedList 或其他东西,它包含对根节点的引用并为您操作列表。您不应该将此逻辑添加到 Node class 本身。

你的this表示这个节点:Node root = new Node(1);你想要的是在insertNodeToHead方法中设置this = n,但是如果使用void方法,你无法使 this 指向另一个节点。 Ravi Thapliyal 的回答已经解释了这一点。

一个解决方案是 Ravi Thapliyal 的建议,它使用另一个 class 来保存对根节点的引用。如果你不想引入一个新的class,建议使用return Node类型的方法来实现你的要求:

public class Node {
    int data;
    Node next = null;

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

    // insert a node to the head of a linked list and return the head
    public Node insertNodeToHead(Node n) {
        n.next = this;
        return n;
    }


    public static void main(String[] args) {
        Node root = new Node(1);
        root.next = new Node(2);
        root.next.next = new Node(3);
        root.next.next.next = new Node(4);

        // insert new node
        Node insertNew = new Node(0);
        Node current = root.insertNodeToHead(insertNew);

        while (current != null) {
            System.out.println(current.data); 
            current = current.next;
        }
    }
}