为什么在链接列表前添加新节点不能在我的代码中工作?

时间:2015-07-05 01:10:46

标签: java linked-list singly-linked-list

为什么我不能将新节点插入到我的链表中,如下所示?我的insertNodeToHead仅在我的返回类型是Node本身并且返回root时才有效。但我希望能够在不返回任何内容的情况下更改链接列表。目前,它应该打印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;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

嗯,您的insertNodeToHead()方法所做的就是将当前root节点作为next节点的insertNew节点附加。执行root = n;在方法之外没有任何影响,因为它只是本地变量。

现在,从技术上讲,新节点已成为列表的根,但您无法看到它,因为您仍在从旧root节点迭代列表,即从列表的第二个节点开始头部有0

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

答案 1 :(得分:0)

您的doLogic(false,false,function(a,b){ return a&&b }); // <-- false doLogic(false,true,function(a,b){ return a&&b }); // <-- false doLogic(false,true,function(a,b){ return a||b }); // <-- true 表示此节点:this您希望在Node root = new Node(1);方法中设置this = n,但如果使用insertNodeToHead方法,则不是能够使void指向另一个节点。 Ravi Thapliyal的回答解释了这一点。

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

Node