java - 在链表末尾插入节点

标签 java recursion data-structures recursive-datastructures

对于这类问题,有一个简单的迭代解决方案。

Node Insert(Node head,int data) {
    Node newNode = new Node();
    newNode.data = data;
    if (head == null) {
        return newNode;
    }
    Node current = head; 
    while (current.next != null) {
        current = current.next;
    }
    current.next = newNode;
    return head;
}

它工作得很好。但我想学习递归并以这种视角看待事物。因此我想出了下面的解决方案,它看起来很优雅,但我不得不承认这只是直觉并且给定的代码有效。我想开发一个处理递归的心智模型,或者至少以某种方式来验证我的代码是否可以正常工作。如何从理论上验证以下解决方案是否有效。

递归版本

Node Insert(Node head,int data) {
    // Base case.
    if (head == null) {
        Node newNode = new Node();
        newNode.data = data;
        return newNode;
    }
    // Smaller problem instance.
    head.next = Insert(head.next, data);
    return head;
}

最佳答案

递归解决方案通常必须遵守以下规则:

  1. 它必须区分一般 情况和基本 情况。然后,它必须包含某种类型的代码 fork (通常是一个 if)到两个代码块:基本 block 和通用 block 。
  2. 基础 block 必须立即返回响应(非递归)。
  3. 通用 block 必须(递归地)重新调用相同的函数,但不是使用相同的参数值(这将产生无限递归),而是使用前进到基础的值案例。

当然,这是一个简单的递归模型,在实践中可能会更复杂(不止一个基本情况,两个函数之间的递归等)。

如果我们根据这些规则从理论上分析您的提案,我们可以看到它符合所有这些规则。

关于java - 在链表末尾插入节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32625964/

相关文章:

java - HashMap 的多映射更好的数据结构

c - 有向图/网络中的随机游走

read_cfg() 的冲突类型

java - Hibernate - MySQL - 连接到数据库

java - 从 Java 中的 PEM 格式文件中提取多个 X.509 证书

r - 具有不等大小组的高效递归随机抽样

sql - 防止触发器相互递归执行?

Python 返回空列表

java - Jframe 内容不显示

java - 您如何管理 java webapps 中的嵌入式配置文件和库?