递归删除链接列表中的元音 - 逻辑错误

时间:2016-03-11 19:25:27

标签: java recursion linked-list

我使用递归从名为MySB2的StringBuilder功能中删除节点链接列表(data:char)中的元音 - 只是寻找一种方法来挑战自己并更好地理解链接列表的递归。 但是我遇到了一个逻辑错误。我添加了一些印刷语句,表明我的方法是删除元音并保留辅音 - 这很棒。但是当我去打印变异的链表(通过我的功能齐全的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;
     }
}

我真的很感激,如果有人能帮助我理解逻辑错误的地方。也许可以帮我弄清楚如何不再这样做。谢谢!

1 个答案:

答案 0 :(得分:0)

致电时

noVowels(curr.next, i++);

您将i的原始值传递给递归方法。您可能希望传递递增的值,这需要

noVowels(curr.next, ++i);

noVowels(curr.next, i+1);

选择使用这两个选项中的哪一个取决于您是否希望在方法返回后仍然会增加i的值。但是,看起来您在代码中选择的两个选项中的哪一个并不重要,因为您的方法在进行递归调用后总是会立即返回,所以它的价值并不重要。在i返回之后。{/ p>

编辑:

实际上你的逻辑有几个问题。我无法测试它,但这应该有效:

     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;

EDIT2:

此代码仍然无法处理第一个节点为元音的情况。