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

Java中队列链表中的递归toString

堵存
2023-03-14

我需要为链表队列实现一个toString()递归方法。我知道我的toString方法在我上周做的一个链表实现中工作得很好,所以我在处理它的队列方面出了问题。

我的QueueList的toString方法:

public String toString() 
{ 

    if (front.info == null)
    {
        System.out.println("Error, queue is empty");
        return "";
    }
    if (front.link  == null) //base case: if this is last element in stack
    {

        return  (" \"" + front.info + "\" , ");
    } 
    else //normal recursive function
    {
        return  (" \"" + front.info + "\" , " + front.link.toString());

    }   

}

以及我的构造函数,例如QueueList:

public class QueueNode 
{
    E info;
    QueueNode link;
}

private QueueNode front;//first element to be placed into queue
private QueueNode rear;//last element to be placed into queue
private int NoE;//counter for number of elements in queue
public QueueList() 
{ 
    front = null;
    rear = null;
    NoE = 0;
}

我试图用这个测试看看里面发生了什么:

public boolean test() { 
    QueueList<String> q = new QueueList<String>();

    q.enqueue("The Godfather");
    q.enqueue("Casino");
    q.enqueue("Goodfellas");
    String r = q.toString();
    q.PrettyPrint();

与输出

IN -> [ "The Godfather" , QueueList$QueueNode@a3901c6] -> OUT. 

我意识到这是因为我说的是前面的。链接toString()toString方法的递归部分,但即使我将其更改为front。链接信息。toString(),我的输出是

IN -> [ "The Godfather" , Casino] -> OUT. 

这可能与我的排队和退队方法有关,如下所示:

public void enqueue(E element) 
{ 

        QueueNode newNode = new QueueNode();//creates new Node to hold element
        newNode.info = element;//set info of new Node to element
        newNode.link = null;//make link null since it's at back of list
        if (rear == null)//checks if queue is empty
        {
            front = newNode;
        }
        else
        {
            rear.link = newNode;//sets second to last node's link to newNode
        }
        rear = newNode;//makes newNode the new last link
        NoE++;//increase counter

}
public E dequeue() throws InvalidOperationException 
{
    if (front == null)//sanitize code
    {
        throw new InvalidOperationException("There is nothing in the queue.");
    }
    E element = front.info;//creates an element file that takes the info in front of queue
    front = front.link;//makes second-to-front element new front
    if (front == null)//if this emptied the queue, make sure rear is also empty
    {
        rear = null;
    }
    NoE--;//reduce counter
    return element;
}

如果可以的话,请帮助我。谢谢

共有1个答案

通奕
2023-03-14

绝对没有必要使toString递归,实际上这样做是不正确的。您的数据结构不是递归的(即树),而是线性的。

如果您的列表包含(比如)100万项,那么堆栈空间很快就会用完(字面上是StackOverflow)。

使用循环代替。

编辑:如果需要递归地执行此操作,那么问题是递归方法必须是QueueNode#toStringRecursive(),而不是Queue#toString()。方法Queue#toString()分配一个缓冲区,并将其提供给执行递归的QueueNode上的特殊toString()方法QueueNode#toString()必须只负责其自身的节点内容。

方法队列#toString()

public String toString()
{
    StringBuilder buf = new StringBuilder();
    if (front == null)
        // queue is empty
    else
        front.toStringRecursive(buf);
    return buf.toString();
}

方法QueueNode#toStringRecursive()

public void toStringRecursive(StringBuilder buf)
{
    buf.append(this.toString());
    if (this.link != null)
        this.toStringRecursive(buf);
}

其中QueueNode.toString()只负责串化一个节点(本身)。

请注意,这是一种方法。也可以将其作为递归方法写入Queue,但不能称为toString()Queue#toString()将设置初始条件,然后调用递归。

 类似资料:
  • 问题内容: 我已经在一个类的Java项目上工作了一段时间。它是链表(此处称为,包含称为的简单节点)的实现。问题是,一切都必须使用递归算法来完成。我可以用一种方法来做所有的事情: 现在,我的函数只是调用一个带有参数以允许递归的辅助函数。 我的助手功能具有的签名。 目前,我使用堆栈来迭代工作,但这不是规范所要求的。我在C语言中找到了一种算法,该算法可以递归地将其递归逆转并将其转换为Java代码,并且可

  • 最后一个函数返回15->20,然后组合为root.next->temp,但是在返回temp的步骤之后,为什么会返回根值。即10->15->20,而我希望只返回temp。 请找到代码,

  • 我是编程新手,从Python开始。我的问题是关于链表,我为链表写了一个类,我需要做的是有一个函数,一个输入作为指向列表头部的引用。据我所知,'linked_list.Head',其中linked_list是有问题的列表的名称。具体使用递归,我试图找到列表的长度作为这个函数的输出。下面是我的代码,我不太明白如何移动到下一个节点,并在本例中使用递归返回节点数。

  • 我正在学习数据结构,并试图理解Java中的链接列表。我的问题是,我有麻烦与删除节点在给定的索引递归。我的目标是得到O(log n),而不是使用循环,最后得到O(n)。 因此,当我试图删除索引2的条目时,它会删除该索引之前的所有数字,但不会删除该索引-因此它会删除[0]和[1],但不会删除[2]。 例如,在此代码中,删除前的数组填充为:。调用后,它有以下条目: 我只想删除13,这样数组就会像这样:

  • 我试图编写一个递归方法来反转队列中的所有元素。 在实现队列的抽象类myQueue中 接口队列 在我的反向方法中,我的目标是不断地递归地从原始队列中退出队列(删除第一个元素),直到队列为空。每次我退出队列时,我都会将该对象放入一个临时队列中。当我的队列为空时,我将从临时队列重新排队到原始队列。 我的第一个问题是定义一个新的临时队列,在我的例子中是bufferQueue。我得到以下信息:

  • 我需要返回带有删除的所有重复元素的链表的头部。我理解这个问题的逻辑,但我在使用递归时变得困惑。 如果我在If条件之前调用函数RemoveDuplicates(head.next);很好用。但是,如果我交换语句的顺序(rest所有内容都完全相同),如下所示: 代码无法正确解决像'1->1->1->1'这样的测试用例。在后一种情况下,我得到的输出是'1->1'。 我真的想要一些关于我如何更好地理解递归