在特殊情况下,LinkedList不会打印第一个元素

时间:2020-06-13 23:04:41

标签: 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 = nextNode;
    nextNode = curr.next;
    foo1(curr, nextNode);
    System.out.println(curr);
}

例如,如果list具有3个元素,例如1-> 2-> 3-> null,则仅打印3和2。 foo方法使用head元素进行了调用,该元素为1,因此不应在输出中同时显示1 aslo。 请帮助我了解我在这里做错了。

2 个答案:

答案 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);
}