我是递归概念的新手,在练习时遇到了一个我无法获得逻辑推理的问题。 对于以下代码段,未打印链接的第一个元素(“假设列表”包含多个元素)。
public void foo(ListNode head) {
foo1(head, head.next);
}
private void foo1(ListNode curr, ListNode nextNode) {
if (nextNode == null) {
return;
}
curr = nextNode;
nextNode = curr.next;
foo1(curr, nextNode);
System.out.println(curr);
}
例如,如果list具有3个元素,例如1-> 2-> 3-> null,则仅打印3和2。 foo方法使用head元素进行了调用,该元素为1,因此不应在输出中同时显示1 aslo。 请帮助我了解我在这里做错了。
答案 0 :(得分:1)
curr = nextNode;
...
System.out.println(curr);
问题是您在打印之前将curr设置为它的后继。
private void foo1(ListNode curr) {
if (curr == null)
return;
System.out.println(curr);
foo1(curr.next);
}
答案 1 :(得分:0)
原因
原因是,在打印第一个元素之前,您的代码将值从第一个元素更改为第二个元素。您的代码中还存在另一个问题,当我们传递一个元素时,它也不会输出该元素。因为考虑到这一点,所以您有一个节点5,下一个节点为空。当您将此节点传递给foo1()
方法时,它立即达到条件nextNode
为null并返回,这里就没有机会打印第一个节点5了。
我修改了您的相同代码以使其按预期运行,请看下面。
public void foo(ListNode head) {
foo1(head, head.next);
}
private void foo1(ListNode curr, ListNode nextNode) {
if(curr != null)
System.out.println(curr);
if (nextNode == null) {
return;
}
curr = nextNode;
nextNode = curr.next;
foo1(curr, nextNode);
}