当前位置: 首页 > 面试题库 >

递归地反转Java中的链表

楚浩然
2023-03-14
问题内容

我已经在一个类的Java项目上工作了一段时间。它是链表(此处称为AddressList,包含称为的简单节点ListNode)的实现。问题是,一切都必须使用递归算法来完成。我可以用一种方法来做所有的事情:public AddressList reverse()

ListNode:

public class ListNode{
  public String data;
  public ListNode next;
}

现在,我的reverse函数只是调用一个带有参数以允许递归的辅助函数。

public AddressList reverse(){
  return new AddressList(this.reverse(this.head));
}

我的助手功能具有的签名private ListNode reverse(ListNode current)

目前,我使用堆栈来迭代工作,但这不是规范所要求的。我在C语言中找到了一种算法,该算法可以递归地将其递归逆转并将其转换为Java代码,并且可以正常工作,但是我对此并不了解。

编辑:没关系,与此同时我也想通了。

private AddressList reverse(ListNode current, AddressList reversedList){
  if(current == null) 
      return reversedList;
  reversedList.addToFront(current.getData());
  return this.reverse(current.getNext(), reversedList);
}

当我在这里时,有人看到此路线有任何问题吗?


问题答案:

在一个答复中有代码将其说明清楚,但是你可能会发现,通过问和回答一些微小的问题(这是The Little Lisper中的方法),更容易从头开始。

  1. null(空列表)的反向是什么?空值。
  2. 一个元素列表的反向作用是什么?元素。

n元素列表的反向操作是什么?列表其余部分的倒序,后跟第一个元素。

public ListNode Reverse(ListNode list)
{
    if (list == null) return null; // first question

    if (list.next == null) return list; // second question

    // third question - in Lisp this is easy, but we don't have cons
    // so we grab the second element (which will be the last after we reverse it)

    ListNode secondElem = list.next;

    // bug fix - need to unlink list from the rest or you will get a cycle
    list.next = null;

    // then we reverse everything from the second element on
    ListNode reverseRest = Reverse(secondElem);

    // then we join the two lists
    secondElem.next = list;

    return reverseRest;
}


 类似资料:
  • 问题内容: 我还没有找到满足我的功能特定需求的任何东西,是的,这是用于家庭作业。 所以我有: 前提条件:x.length> 0 我不能让函数返回任何东西,而唯一的参数是数组这一事实使我感到困惑。 我已经尝试过将循环与递归一起使用,但是我尝试过的一切似乎都以生成函数的无限实例结束。 我已经有了一个想法/建议与该函数一起使用另一个函数,但是,当前如何递归地使用原始函数超出了我的范围。 任何帮助表示赞赏

  • 本文向大家介绍单链表反转 递归法Java实现相关面试题,主要包含被问及单链表反转 递归法Java实现时的应答技巧和注意事项,需要的朋友参考一下 经历了很多面试,面试官最爱考察的算法无非是斐波那契数列和单链表反转,尽管是这些都是基础知识,然而我对单链表反转有更多的想法。 递归法是我早期最爱在面试中使用的算法,很有逼格,写起来非常优雅,非常好理解。 先定义链表数据结构 如上代码所示 递归法会逐层确定该

  • 我做了一个使用递归方法反转单链表的函数。然而,我在执行下面的代码时遇到了一些困难: 我应该如何在ReverseCursive函数/方法中传递第二个参数,以便执行它? 作为第二个参数,我想简单地传递链表的头节点。但是我不知道如何从类的init方法中获取头节点linked_list 我试了几件事,但都解决不了。也许我不太擅长OOP概念。有人能帮我解决这个问题吗?

  • 请检查下面的反转功能。剩下的代码应该没问题。由于某种原因,该函数没有反转双链接列表。 双链表节点结构 双链表结构 按从头部到尾部的顺序排列。 请检查下面的反向函数,因为此函数不会返回反向双链接列表。检查是否有任何错误并让我知道。

  • 还缺少的是将最后一个节点的next赋值为NULL。 在任何世界里,像这样的东西会起作用吗?它给出了一个运行时/分段错误。

  • 我刚刚开始学习递归,并能够使用它编写一个简单的阶乘程序,没有太多问题。现在我正在尝试编写一个递归方法,该方法以相反的顺序写入数组,但我不知道我做错了什么。我错过了什么?非常感谢。