【问题标题】:What is wrong with this code (Simple LinkedList)这段代码有什么问题(Simple LinkedList)
【发布时间】:2017-11-20 07:22:07
【问题描述】:

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

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

    }

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

例如,

存在的链表是 10 -> 20 -> 30

使用 insert(head,4) 之后 我仍然得到 10 -> 20 -> 30

虽然在方法插入时我取消选中打印方法 它显示第一个节点数据为 4

但是在遍历时没有显示!

为什么?

【问题讨论】:

  • 您似乎在前面插入元素。你的 insert 方法不应该返回新的 head 元素? (是,节点?)
  • 应该的。我发现的一个错误是在 main 方法中我设置 Node head = ob1 所以,每次它只取 head = ob1 (即 10)。如何解决这个问题?
  • 你的 insert 方法应该返回新的 head 值,这应该更新调用函数的 head 值。

标签: java linked-list


【解决方案1】:

在 Java 中调用方法时,变量被复制,而不是被引用。这意味着在您的情况下,insert 方法内的变量 head 只是本地变量,其修改在方法外将不可见。

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

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

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

    head = node;

    return head;
}

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

// 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);

【讨论】:

    【解决方案2】:

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

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

    使用传递的Node 参数修改列表的唯一方法是该方法是否会更改该NodenextLink

    【讨论】:

    • 好的!知道了。我发现了我的错误。在我的 main 方法中,我分配了 Node head = ob1 (ie 10) 所以每次调用的方法都只取 head 。我现在将我的插入方法的返回类型更改为 Node 并分配 head = insert(head,4) 以自行更新它!谢谢。
    • @JoeBrown 我不确定将列表的头部作为main 方法中的局部变量是否是个好主意。通常列表的头部是 LinkedList 类的实例变量。只有 LinkedList 类的方法才能更改列表的头部。
    猜你喜欢
    • 2015-04-25
    • 2018-09-09
    相关资源
    最近更新 更多