我开始了解递归,
我已将递归代码附加到合并两个排序的链表,
我的问题是,我了解到“ 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;
}
}
答案 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);
方法中调用 main()
。因此根为0,您的节点为10和5,15。
在第一次调用sortedLists()
时,temp变为5,而second
现在带有15,因为first.data > second.data
。
现在,您再次调用方法sortedLists()
,但具有新值:现在根为5,首先保留10,第二为15。我们在 inside < / em>函数并以新值开头:
first.data < second.data
,温度变为10,第一个现在为空。sortedLists()
上接到了另一个电话。我们将值first = null second = 15 root = 10
传递给该函数,然后再深入一步。
first
现在为零,因此temp.next
将是second
(15)sortedLists()
第一次终止!)root.next = temp;
,还记得在这种情况下的温度是多少吗? temp是10,但已通过上述功能进行了更新。新的temp
为10-> 15,因此我们的root
如下:5-> 10-> 15。 现在我们回到第一个调用中,看看会发生什么:在3.3中,我们更新了它的根目录。 3.3的根是3的温度,因为我们叫sortedLists(first, second, temp)
(temp用作根,因为此函数的最后一个参数是Node root
)。
总结:我们的根仍然是0,温度是5-> 10-> 15
root.next
在分配0-> 5-> 10-> 15之后。现在您在类中的main方法上方声明的根有了一个值。
我们返回的温度是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;
}
我希望这有助于递归。