当前位置: 首页 > 知识库问答 >
问题:

将字符串转换为LinkedList并使用递归浏览

武峻熙
2023-03-14

我对递归非常陌生(我需要使用它),并且在使用我的搜索方法时遇到了一些严重的逻辑问题。请看下面:

//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;
}

输出是长度为1的“nodeOne null,返回null节点数据”打印。我不明白最后一个else if语句中的递归语句是如何到达的,而第一个if语句中的null语句似乎也在到达。

我尝试重新排列if语句,以便if(nodeOne!=null)是第一个,但这给了我一个NullPointerExc0019。不知道我做错了什么。特别是因为我可以使用toString()方法打印节点中的数据,所以我知道节点没有空数据。

有人能帮我理解吗?

共有1个答案

仲孙雅达
2023-03-14

我写了一个完整的例子,我希望这是你需要的。如果你想循环字符串StackOverflowi

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()方法作为练习留给读者。但是由于性能原因,使用StringBuilderchar[]将是一个好主意。

 类似资料:
  • 我需要在 ML 中编写自己的递归函数,该函数以某种方式使用 ord 将一串数字转换为整数类型。我可以使用辅助函数,但显然我应该能够在不使用辅助函数的情况下做到这一点(根据我的教授的说法)。 我可以假设输入是有效的,并且是一个正整数(当然是字符串类型)。 因此,调用str2int("1234")应该输出1234: int 我假设我需要在某个时候使用爆炸和内爆,因为 ord 对字符进行操作,而我的输入

  • 我只是无法在c中转换不同的数据类型,我知道c是一种强类型语言,所以我在这里使用了,但我面临一个问题,错误消息是 从“std::string{aka std::basic_string}类型转换为“int”类型的static_

  • 正如在这里被问及的,这个#58538732的后续问题 根据Lukas Eder的建议,我编写了一个,将转换为 现在看起来如下所示 出现以下错误消息: 线程“main”java.lang中出现异常。错误:未解决的编译问题: 无法访问QueryFeaturesTask类型的封闭实例。必须使用QueryFeaturesTask类型的封闭实例限定分配(例如,x.new A(),其中x是QueryFeatu

  • 我有一个关于如何将“递归”转换为“尾部递归”的问题。 这不是家庭作业,只是在我试图润色算法书籍中的递归定理时出现的一个问题。 我熟悉使用递归的两个典型示例(阶乘和斐波那契序列),也知道如何以递归方式和尾部递归方式实现它们。 我的代码如下(我使用Perl只是为了使其简单,但可以轻松地转换为C/Java/C)。 运行代码时,输出如下: 递归函数在返回之前使用不同的参数调用自己两次。我尝试了几种方法将其

  • 问题内容: 问题:转弯 进入 Perl支持可以在替换字符串中使用的“ \ L”操作。 模式类不支持此操作: 此类不支持的Perl构造:[…]预处理操作\ l \ u,\ L和\ U。 https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html 问题答案: 您无法在Java正则表达式中执行此操作。您必须使用和手动进行

  • 问题内容: 如何将经典字符串转换为f字符串? 输出: 所需的输出: 问题答案: f字符串是 语法 ,而不是对象类型。您不能将任意字符串转换为该语法,该语法会创建一个字符串对象,而不是相反。 我假设您想用作模板,因此只需在对象上使用方法: 如果要提供可配置的模板服务,请创建一个包含所有可以插值的字段的名称空间字典,并与调用语法一起使用以应用名称空间: 然后,用户可以在字段中的名称空间中使用任何键(或