Recursion LinkedList在特殊情况下不打印第一个元素
我不熟悉递归概念,在练习时遇到了一个无法进行逻辑推理的问题。 对于下面的代码段,链接的第一个元素没有打印出来,假设列表中有多个元素Recursion LinkedList在特殊情况下不打印第一个元素,recursion,data-structures,linked-list,Recursion,Data Structures,Linked List,我不熟悉递归概念,在练习时遇到了一个无法进行逻辑推理的问题。 对于下面的代码段,链接的第一个元素没有打印出来,假设列表中有多个元素 public void foo(ListNode head) { foo1(head, head.next); } private void foo1(ListNode curr, ListNode nextNode) { if (nextNode == null) { return; } curr = nextNo
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);
}
现在,例如,若列表有3个元素,如1->2->3->null,则只打印3和2。foo方法使用head元素进行了调用,head元素是一个元素,所以它不应该在输出中同样打印1。
请帮助我理解我在这里做错了什么。curr=nextNode;
...
System.out.printlncurr;
问题是,在打印之前,将curr设置为其后续项
私有void foo1ListNode curr{
如果curr==null
回来
System.out.printlncurr;
foo1curr.next;
}
理由
原因是,在打印第一个元素之前,代码会将值从第一个元素更改为第二个元素。代码中还有一个问题,当我们传递一个元素时,它也不会打印该元素。因为考虑这一点,你有一个节点5,下一个节点是NULL。当您将此节点传递给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);
}