当前位置: 首页 > 知识库问答 >
问题:

对象值为空

赖绪
2023-03-14

我是Java新手,我正在尝试实现一个链表(我知道有一个链表类用于此目的,但从头开始就可以让我理解该语言在内部是如何工作的)

在main方法中,我声明了4个节点并初始化了3个。链表的头节点设置为空。第一次使用参数head和newNode调用add函数时,head为null,所以我初始化head并将newNode的值赋给它。在main方法中,我希望head对象应该从add方法中设置新的值。但头仍然是空的。

如果我能理解为什么会这样,我将不胜感激。

如果代码不干净,请道歉,非常感谢!

public class LinkedList
{
    public void add(Node newNode, Node head)
    {
        if(head == null) 
        {
            head = new Node(); 
            head = newNode;              
        }
        else 
        {
            Node temp = new Node(); 
            temp = head; 

            while(temp.next!=null)
            {
                temp = temp.next; 
            }
            temp.next = newNode; 
        }    
    }

    public void traverse(Node head)
    {
        Node temp = new Node(); 
        temp = head; 

        System.out.println("Linked List:: ");

        while(temp.next!=null);  
        {
           System.out.println(" "  + temp.data); 
            temp = temp.next;
        }
    }

    public static void main(String args[])
    {
        Node head = null;
        Node newNode = new Node(null, 5); 
        Node newNode2 = new Node(null, 15); 
        Node newNode3 = new Node(null,30); 

        LinkedList firstList = new LinkedList(); 

        firstList.add(newNode,head); 

       // Part that I don't understand
       // why is head still null here? 

        if(head==null)
        {
         System.out.println("true");
        }

        firstList.traverse(head); 
        firstList.add(newNode2,head); 
        firstList.traverse(head); 
        firstList.add(newNode3,head); 
        firstList.traverse(head); 

    }

}

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

    public Node(Node next, int data)
    {
        this.next = next; 
        this.data = data; 
    }

    public Node()
    {
        this.next = null; 
        this.data = 0; 
    }

}

共有3个答案

秦弘亮
2023-03-14

使“头”引用另一个节点对调用代码没有影响(java传递引用,在java中引用是地址的“值”)。

你需要一个永久的头引用,所以把它作为你的类的一个字段:

private Node head = new Node(); // the head of your Node tree

public void add(Node newNode, Node parent) {
    // add node to parent.
    // for some calls, the parent will be the head
}
祁正浩
2023-03-14

我认为问题出在“add”函数内部。您只是在函数范围内更改“head”的值,而不是在函数范围外。您可以在这里找到有关Java处理传递参数值的方式的有用信息。

这里是LinkedList在Java中的一个很好的实现。

寿伟
2023-03-14

Java方法参数是按值传递的。

public void add(Node newNode, Node head)
{
    if(head == null) 
    {
        head = new Node(); 
        head = newNode;              
    }
    ...

上面只修改了add范围内的局部变量head。不能引用main范围内的局部变量head。如果您希望调用方能够检索新值,也许您应该返回该值。

说实话,面向对象编程的一个主要原则是封装;你的链接列表的标题最好是内部维护的字段。为什么它应该是一个单独的部分?如果你真的想把隔离,那么为什么不遍历添加静态?你应该试着修改你的设计。我决定在这里重写你的代码。

final class List {

  private Node head;

  public void add(final Node node) {
    if (head == null) {
      head = new Node();
    }
    Node cur;
    for (cur = head; cur.next != null; cur = cur.next)
      ;
    cur.next = node;
  }

  public String toString() {
    final StringBuilder builder = new StringBuilder("Linked List::");
    for (Node cur = head.next; cur != null; cur = cur.next) {
      builder.append("\n ").append(cur.data);
    }
    return builder.toString();
  }
}

final class Node {

  int data;
  Node next;

  Node(final int data) {
    this.data = data;
  }

  Node() { }
}

...然后,测试:

  private static Node[] nodesFor(final int... values) {
    int n = values.length;
    final Node[] nodes = new Node[n];
    while (n > 0) {
      nodes[--n] = new Node(values[n]);
    }
    return nodes;
  }

  public static void main(final String[] argv) {
    final List list = new List();
    for (final Node node : nodesFor(5, 15, 30)) {
      list.add(node);
      System.out.println(list);
    }
  }

 类似资料:
  • 根据一个对象中创建一个键-值对数组。 使用 Object.keys() 和 Array.map() 遍历对象的键并生成一个包含键值对的数组。 const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); objectToPairs({ a: 1, b: 2 }); // [['a',1],['b',2]]

  • readOperationCount Number - I/O读操作的数量. writeOperationCount Number - I/O写操作的数量. otherOperationCount Number - I/O其它读写操作的数量. readTransferCount Number - I/O读取传输的次数. writeTransferCount Number - I/O写入传输的次数.

  • 我正在使用GoogleGSON2.4版本,我已经将文件gson-2.4.jar添加到我的Android项目中的Android studio中的libs文件夹下。代码生成成功。 我的代码如下 json始终为空值。 我的预期结果为 我该怎么修好它?谢谢

  • 问题内容: 我想将对象数组转换为javascript中具有键值对的对象。 我如何将其转换为诸如 我希望大多数浏览器都支持它。 问题答案: 您可以使用和传播语法来创建具有给定对象数组的单个对象。

  • 问题内容: 我很惊讶地发现这种情况总是成立的: 似乎无论最初是什么类型,它都将转换为相应类的实例。是否存在确定对象是否可靠的方法? 问题答案: 更新 我在下面显示的代码被报告在发行版本中不起作用。(请参阅下面的Paul Cantrell的评论。) 对于我的“据我测试”的道歉过于有限。 当我找到关于此的更多信息时,我将更新此答案。 我不确定我们是否可以在下一个Beta(或GM或已发布的版本…)中看到

  • 对于剑道中的绑定行为,似乎有一个相当奇特的设计决策。 我试图绑定一个null值到一个下拉列表。如果(远程来源的)值为null,那么Kendo将生成对象以绑定到该值,例如,使用下拉列表的data-value-field/value。这使得保存修改后的视图模型非常不可靠,因为现在整个对象将被传输,而不是简单的数据类型。 示例:为。从下拉列表中选择值后,如 值(JSON)然后是而不是 有人对此有一个好的