这段代码有什么问题(Simple LinkedList)

时间:2017-11-20 07:22:07

标签: java linked-list

所以,我已经研究了链表并创建了这种插入方法。

private void insert(Node head, int data)
    {
        Node node = new Node(data);

        Node first = head;

        if(first == null)
        {
            head = node;
        }
        else
        {
            node.nextLink = first;
            head = node;
            //System.out.println(node.data);
        }
    }

和这个遍历方法

public void traversingLinkedList(Node head)
    {
        Node current = head;

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

    }

但是在我插入节点时它没有显示节点。 节点数据显示我取消注释方法 insert 中的打印行。

例如,

LinkedList present是10 - > 20 - > 30

使用插入后(头部,4) 我仍然得到10 - > 20 - > 30

虽然在取消选中print方法的方法插入中 它将第一个节点数据显示为4

但是在遍历时没有显示!

为什么?

2 个答案:

答案 0 :(得分:1)

head是一个局部变量,因此在insert(Node head, int data)内为其分配值不会影响传递给该方法的Node

如果您的insert方法是某个LinkedList类的一部分,则该类应该包含对列表头部的引用,并且insert应该分配给该引用。在这种情况下,您不需要将Node head作为参数传递给insert

使用传递的Node参数修改列表的唯一方法是,该方法是否会更改nextLink的{​​{1}}。

答案 1 :(得分:1)

在Java中调用方法时,会复制变量而不会引用变量。这意味着在您的情况下,head方法中的变量insert只是本地的,并且在方法之外不会显示其修改。

因此,由于您在前面插入元素,插入后的新头是您创建的节点(不是前一个),您需要返回它以更新下一个调用。此外,您可以简化插入方法的代码,因为您将始终更新头部值,唯一的条件部分是列表中是否有更多元素。

private Node insert(Node head, int data)
{
    Node node = new Node(data);

    if (head != null) {
        node.nextLink = head;
    }

    head = node;

    return head;
}

在这种情况下,您的主要方法应如下所示:

// LinkedList 10->20->30
head = new Node(30);
head = insert(head, 20);
head = insert(head, 10);

// Add the new 4 head: 4->10->20->30
head = insert(head, 4);
// Traversing
traversingLinkedList(head);