以下拆分器方法旨在返回两个独立链表的 IntLinkedBag 数组。它通过调用 listSplitLessGreater 方法来实现此目的,并传递整数链表的头部引用和拆分器整数值,该值返回一个 IntNode 数组,该数组包含已排序的两个新整数链表的头部引用。拆分器方法按编写方式工作。这是我能让它工作的唯一方法。但我知道必须有一种更简单/更好的方法来编码它。我想用这个替换//******** 之间的所有内容
newLists[0].head = answer[0];
newLists[1].head = answer[1];
但是当我这样做时,我在运行程序时收到空指针豁免错误。我的问题是为什么?编写此代码的正确方法是什么?
public IntLinkedBag[] splitter(int target)
{
IntLinkedBag[] newLists = new IntLinkedBag[2];
IntNode[] answer = new IntNode[2];
answer = IntNode.listSplitLessGreater(head, target);
//**********************************
IntLinkedBag b = new IntLinkedBag();
IntLinkedBag c = new IntLinkedBag();
b.add(5);
b.head = answer[0];
newLists[0] = b;
c.add(5);
c.head = answer[1];
newLists[1] = c;
//**********************************
return newLists;
}
我像下面一样更新了我的代码。我没有收到任何错误,但它现在没有返回任何内容。即使测试代码打印了链表....和想法的?
public IntLinkedBag[] splitter(int target)
{
IntLinkedBag[] newLists = {new IntLinkedBag(), new IntLinkedBag()};
IntNode[] answer = new IntNode[2];
answer = IntNode.listSplitLessGreater(head, target);
newLists[0].head = answer[0];
newLists[1].head = answer[1];
System.out.println(IntNode.showList(newLists[0].head)); //test code
System.out.println(IntNode.showList(newLists[1].head)); //test code
return newLists;
}
添加此代码可以使其工作,但为什么需要这样做?
newLists[0].add(5); //adding a number to linked list to create a temporary head.
newLists[1].add(5); //don't know why I have to have this but its only way code works correctly
在newlists[0]
或newlists[1]
内部实际上没有初始化任何内容;数组在创建时创建默认值null
。
尝试这样的事情:
IntLinkedBag[] newLists = new IntLinkedBag[2];
for(int i = 0; i < newLists.length; i++) {
newLists[i] = new IntLinkedBag();
}
更紧凑,你可以这样做:
IntLinkedBag[] newLists = {new IntLinkedBag(), new IntLinkedBag()};
这在没有循环的情况下做同样的事情。