我正在使用递归从节点链表(数据:char)中删除元音,具有名为MySB2的StringBuilder功能-只是在寻找一种方法来挑战自己并更好地理解链表的递归。但是我遇到了一个逻辑错误。我添加了一些打印语句,表明我的方法正在删除元音并保留辅音 - 这很棒。但是当我去打印突变的链表(通过我功能齐全的 toString() 方法)时,它会这样做:之前:幸福就是爱后:Hpnsslbutv
这是我的代码:
//The calls in my main are below
public static void main(String[] args)
{
System.out.println("nTesting remove vowels method");
b1 = new MySB2("Happiness is All About Love");
System.out.println("Before: " + b1);
b1.removeVowels();
System.out.println("After: " + b1);
}
//These methods below are within the linked list class, MySB2
public class MySB2
{
public MySB2 removeVowels()
{
noVowels(firstNode, 0);
//firstNode is the reference to the 1st node in the linked list
return this;
}
private MySB2 noVowels(CNode curr, int i)
{
if(curr != null)
{
if(isAVowel(curr) != true)
{
System.out.println("noVowels() keeping: " + curr.data);
noVowels(curr.next, i++);
return this;
}
else if(isAVowel(curr) == true)
{
i++;
CNode nodeBefore = getNodeAt(i-1);
CNode nodeAfter = curr.next;
System.out.println("noVowels() removing: " + curr.data);
nodeBefore.next = nodeAfter;
length--;
}
noVowels(curr.next, i++);
}
return this;
}
private boolean isAVowel(CNode curr)
{
char c = Character.toLowerCase(curr.data);
if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
{
//System.out.println("isAVowel() is detecting: " + c);
//returning true for the proper letters
return true;
}
return false;
}
}
如果有人能帮助我理解我在逻辑上错在哪里,我将不胜感激。也许可以帮助我弄清楚如何不再这样做。谢谢!
当你打电话时
noVowels(curr.next, i++);
您正在将 i
的原始值传递给递归方法。您可能希望传递递增的值,这将需要
noVowels(curr.next, ++i);
或
noVowels(curr.next, i+1);
选择使用这两个选项中的哪一个取决于是否希望在方法返回后仍递增 i
的值。但是,看起来您在代码中选择两个选项中的哪一个并不重要,因为您的方法在进行递归调用后总是立即返回,因此返回后i
的值是什么并不重要。
编辑:
实际上,您的逻辑存在几个问题。我无法测试它,但这应该有效:
if(curr != null)
{
if(!isAVowel(curr))
{
System.out.println("noVowels() keeping: " + curr.data);
}
else
{
//i++; don't increment i, since you want to remove the current node
CNode nodeBefore = getNodeAt(i-1);
CNode nodeAfter = curr.next;
System.out.println("noVowels() removing: " + curr.data);
nodeBefore.next = nodeAfter;
length--;
}
return noVowels(curr.next, i+1); // you only need one recursive call
}
return this;
编辑2 :
此代码仍然无法处理第一个节点是元音的情况。