合并链接列表中的递归

时间:2018-11-24 01:37:00

标签: java recursion data-structures linked-list

我开始了解递归,

我已将递归代码附加到合并两个排序的链表,

我的问题是,我了解到“ temp”会在第一或第二个为空时返回temp->(第一(或)第二)的值,但我无法理解以下事实:

例如,如果我有5-> 10-> 15-> 20。

最终函数返回15-> 20,然后将其合并为root.next-> temp,但是在该步骤之后,当我返回temp时,为什么返回根值。 即10-> 15-> 20,当我希望只返回温度时。

请找到代码,

 /**
 * 
 */
 *
 *
 */
public class MergeLinkedLists {

    static class Node {

        int data;
        Node next;

        public Node(int value) {
            this.data = value;
        }

    }

    Node root;

        /**
     * @param args
     */

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MergeLinkedLists s1 = new MergeLinkedLists();
        s1.root = new Node(0);
        Node n1 = new Node(10);
        //n1.next = new Node(20);
        //n1.next.next = new Node(30);

        Node n2 = new Node(5);
        n2.next = new Node(15);
        //n2.next.next = new Node(50);

        Node result = sortedLists(n1, n2, s1.root);

        while (result != null) {
            System.out.print(result.data + "--->");
            result = result.next;
        }
    }

    /**
     * @param n1
     * @param n2
      * @param root2
     */
     private static Node sortedLists(Node n1, Node n2, Node root) {
         // TODO Auto-generated method stub

        Node temp = root;

        Node first = n1; // 10 20 30
        Node second = n2; // 5 15 50

        if (first == null) {
            temp.next = second;
            return temp;
        } else if (second == null) {
            temp.next = first;
            return temp;
        }

        else if (first.data < second.data) {
            temp = new Node(first.data);
            first = first.next;
        } else {
            temp = new Node(second.data);
            second = second.next;
        }

        sortedLists(first, second, temp);
        root.next = temp;
        System.out.println("The Temp Data is ::::"+temp.data);
        return temp;

    }

}

1 个答案:

答案 0 :(得分:0)

因为在这种情况下,temp 的根值。不用担心,这是您需要了解递归本身的一件事。

了解代码功能的一个重要功能是使用调试器。为函数调用设置一个断点,您可以逐步执行程序,同时可以观察变量的变化。

此外,让我们看一下您的代码。

重要的一点是,每当您调用sortedLists(first, second, temp);时,指针都会进入其中,直到函数终止(因此,当它返回temp时)。随着程序的继续,您将多次调用此函数,因此它将更深入地了解其自身的功能。 然后,它将逐步逐步携带信息,直到sortedLists(first, second, temp);的第一个调用终止,并且这在您的主要方法Node result = sortedLists(n1, n2, s1.root);

我将尝试理解您的示例:

    Node result = sortedLists(n1, n2, s1.root);方法中调用
  1. main()。因此根为0,您的节点为10和5,15。

  2. 在第一次调用sortedLists()时,temp变为5,而second现在带有15,因为first.data > second.data

  3. 现在,您再次调用方法sortedLists(),但具有新值:现在根为5,首先保留10,第二为15。我们在 inside < / em>函数并以新值开头:

    1. 由于first.data < second.data,温度变为10,第一个现在为空。
    2. 再说一次:我们在sortedLists()上接到了另一个电话。我们将值first = null second = 15 root = 10传递给该函数,然后再深入一步。
      1. 由于first现在为零,因此temp.next将是second(15)
      2. temp现在看起来像这样:10-> 15,我们返回。 (这是sortedLists()第一次终止!)
    3. 我们现在回到这里,可以继续进行root.next = temp;,还记得在这种情况下的温度是多少吗? temp是10,但已通过上述功能进行了更新。新的temp为10-> 15,因此我们的root如下:5-> 10-> 15。
    4. 然后打印温度头,即10。此功能也终止。
  4. 现在我们回到第一个调用中,看看会发生什么:在3.3中,我们更新了它的根目录。 3.3的根是3的温度,因为我们叫sortedLists(first, second, temp)(temp用作根,因为此函数的最后一个参数是Node root)。

  5. 总结:我们的根仍然是0,温度是5-> 10-> 15

  6. root.next在分配0-> 5-> 10-> 15之后。现在您在类中的main方法上方声明的根有了一个值。

  7. 我们返回的温度是5-> 10-> 15,我们完成了。

我们现在可以继续执行main方法,打印结果。

要在没有result.next时摆脱--->,可以像这样处理空值:

 while (result != null) {
            if (result.next != null)
            System.out.print(result.data + "--->");
            else System.out.println(result.data);
            result = result.next;
        }

我希望这有助于递归。