我是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;
}
}
使“头”引用另一个节点对调用代码没有影响(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
}
我认为问题出在“add”函数内部。您只是在函数范围内更改“head”的值,而不是在函数范围外。您可以在这里找到有关Java处理传递参数值的方式的有用信息。
这里是LinkedList在Java中的一个很好的实现。
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)然后是而不是 有人对此有一个好的