已排序的双链表插入

时间:2017-12-01 19:38:47

标签: algorithm recursion data-structures doubly-linked-list insertion

我是数据结构和递归概念的新手。我很难理解为什么以及他能够在这个概念中使用递归的人。我在论坛中找到了这个代码,我无法理解这个概念。对于2 1 3 4的简单情况,如果有任何人可以解释迭代步骤,我将非常感谢。

以下是黑客排名的链接: https://www.hackerrank.com/challenges/insert-a-node-into-a-sorted-doubly-linked-list

Node SortedInsert(Node head,int data) {
    Node n = new Node();
    n.data = data;
    if (head == null) {
        return n;
    }
    else if (data <= head.data) {
        n.next = head;
        head.prev = n;
        return n;
    }
    else {
        Node rest = SortedInsert(head.next, data);
        head.next = rest;
        rest.prev = head;
        return head;
    }
}

1 个答案:

答案 0 :(得分:1)

递归: 递归意味着函数调用自身。它被用作保存状态信息的简单方法,这些算法需要保存多个状态,通常是大量状态,并以相反的顺序检索它们。 (有些替代技术更专业,更不容易出现内存问题,例如使用Stack对象来保存程序状态)。

此示例很差,但典型的是递归的介绍。是的,您可以使用递归迭代链表,但绝对没有理由。循环更合适。这纯粹是为了演示递归的工作原理。那么,回答你的问题&#34;为什么?&#34;它只是让你可以学习这个概念,然后在其他实际有意义的算法中使用它。

当您拥有一棵树而不是链接列表时,递归很有用,其中每个节点都指向多个其他节点。在这种情况下,您需要保存状态(您所在的节点以及您最后调用的子节点),以便您可以遍历其中一个链接节点,然后返回并转到下一个节点。

您还问过&#34;&#34;。当一个函数调用它自己时,它的所有变量都被保存(在程序堆栈上),并为它自己的下一次迭代创建新的变量。然后,当该调用返回时,它将返回到调用它的位置并加载前一组变量。这与跳跃&#34;非常不同。或某种循环,每次使用相同的变量副本。通过使用递归,每次调用时都会有每个局部变量的新副本。即使是数据&#34;也是如此。示例中的变量,永远不会改变(因此,效率低下)。