我的节点构造函数如下:
public Node(int ndata, Node nlink)
{
this.data=ndata;
this.link = nlink;
}
此构造函数采用两个参数,即节点的数据和到下一个节点的链接。对于我所看到的构成链表的所有内容,都会这样创建一个新节点:
Node nextNode =新节点(数据);
但是,由于某种原因我没有将第二个参数放入程序,则无法运行该程序。这是我的代码。
public static Node ListGenerator()
{
// Generate RANDOM List
int j, cint, size;
Scanner input = new Scanner(System.in);
System.out.println("Please enter the size");
size = input.nextInt();
//Node head;
Node current = null;
for (j = 1; j <= size; j++) {
cint = (int)((Math.random() * 100)+1);
Node nextNode = new Node (cint,current.getLink());
current = nextNode;
} return current;
// ...
}
我是链表的新手,所以这对我来说很困惑,即使这可能是我没有得到的非常简单的东西。
答案 0 :(得分:1)
您的代码中有几点需要考虑:
除head
外,您还需要一个current
变量才能最终返回到调用方(此注释已被注释掉,所以您在正确的位置上)。
您对current.getLink()
的第一次呼叫将崩溃,因为current
的开头为null
。
此构造函数对于Node
是正常的。您可以将null
传递给第二个参数作为下一个节点的临时占位符,前提是您可以使用setter以便以后使用。您可能希望重载构造函数以支持link
作为可选参数,但是如果您无权编辑类,则不必这样做。
在Scanner
内添加ListGenerator
不必要地将其用法仅限于用户输入。此I / O逻辑最好放在您的main
方法中(或任何调用范围)中。沿着这些思路,进一步考虑将节点值的数组传入并从该方法中移出随机数生成,从而进一步提高模块性/可重用性。
Java中的方法名称应小写驼峰。
像int j, cint, size;
这样的方法顶部的ANSI C样式变量声明通常在Java中不使用;最好在循环范围内声明索引变量。
这是一种从列表末尾开始并使用指向head
和紧随其后的节点next
的指针前进的方法,null
在第一个指针上迭代:
class Node {
public int data;
public Node link;
public Node(int data, Node link) {
this.data = data;
this.link = link;
}
}
class Main {
public static Node listGenerator(int size) {
Node next = null;
Node head = null;
for (int i = 1; i < size; i++) {
head = new Node((int)(Math.random() * 100) + 1, next);
next = head;
head = null;
}
head = new Node((int)(Math.random() * 100) + 1, next);
return head;
}
public static void main(String[] args) {
Node head = listGenerator(6);
while (head != null) {
System.out.print(head.data + "->");
head = head.link;
}
System.out.println("null");
}
}
输出:
13->33->87->82->35->87->null