我对递归很新(我需要使用它)并且使用我的一种搜索方法遇到了一些严重的逻辑问题。请参阅以下内容:
//these are methods within a Linked List ADT with StringBuilder functionality
//the goal here is to access the char (the Node data) at a certain index
public char charAt(int index)
{
if((firstNode == null) || (index < 0) || (index >= length + 1))
//firstNode is the 1st Node in the Linked List, where the search begins
{
System.out.println("Invalid Index or FirstNode is null");
IndexOutOfBoundsException e = new IndexOutOfBoundsException();
throw e;
}
else
{
char c = searchForChar(firstNode, index);
return c;
}
}
private char searchForChar(Node nodeOne, int index)
{
int i = 0;
if(nodeOne == null) //basecase --> end
{
i = 0;
System.out.println("nodeOne null, returning null Node data");
return 'n';
}
else if(i == index) //basecase --> found
{
i = 0;
return nodeOne.data; //nodeOne.data holds the char in the Node
}
else if(nodeOne != null) //search continues
{
searchForChar(nodeOne.next, index);
i++;
return nodeOne.data;
}
return nodeOne.data;
}
输出为&#34; nodeOne null的长度为1的打印,返回空节点数据&#34;。我不明白最后一个else-if语句中的递归语句是如何在达到第一个if语句中的null语句时达到的。
我尝试重新排列if语句,以便if(nodeOne != null)
是第一个,但这给了我一个NullPointerException
。不确定我做错了什么。特别是因为我可以使用toString()
方法在节点中打印数据,所以我知道节点不具有空数据。
有人可以帮我理解吗?
答案 0 :(得分:1)
我写了一个完整的例子,我希望这是你需要的。如果您使用StackOverflow
遍历字符串i < 14
,它还会打印空字符\0
,如果您使用i < 15
它会给您IndexOutOfBoundsException
。每次实际说我需要(index - 1)
跳到我的目标节点时,将索引减少1。
public class CharTest {
public static class Node {
private char content;
private Node nextNode;
public Node () {
content = '\0';
nextNode = null;
}
public Node (String str) {
Node temp = this;
for (int i = 0; i < str.length(); i++) {
temp.content = str.charAt(i);
temp.nextNode = new Node();
temp = temp.nextNode;
}
}
public char charAt(int index) {
if (index == 0) {
return content;
} else if (index < 0 || nextNode == null) {
throw new IndexOutOfBoundsException();
}
return nextNode.charAt(index - 1);
}
}
public static void main(String[] args) {
Node test = new Node("StackOverflow");
for (int i = 0; i < 13; i++) {
System.out.print(test.charAt(i));
}
System.out.println();
}
}
我将以迭代方式或递归方式向读者提出toString()
方法。但由于性能原因,使用StringBuilder
或char[]
会是一个好主意。