使用递归时返回语句的混淆

时间:2016-09-27 07:03:46

标签: java recursion

我正在使用递归在链表的末尾插入一个节点。代码工作正常。但我对退货声明有点困惑。

逐一了解我的理解:

第一个返回将返回一个新节点head == null并且该函数将完成 - 无需再做其他事情

第二个将返回在尾部末尾创建的节点 - 无需再做什么

每次以递归方式调用insertNodeAtTail时,最后一个将把所有节点放在堆栈上。当第二次返回被称为head.next == null时。所有节点都将从堆栈中弹出,直到它到达第一个节点。有效地成为链表中的第一个节点(指向头部)。

我的理解是否正确?

public Node insertNodeAtTail(Node head, int data) {
    if(head == null) {
    /* List is empty so just return the new node */
        Node node = new Node();
        node.data = data;
        node.next = null;
        return node;
    }
    else if (head.next == null) {
    /* We are at the end of the list so insert the new node */
        Node node = new Node();
        node.data = data;
        head.next = node;
        return head;
    }
    else {
    /* Travese the list by passing the next node in the list until next is NULL */
        insertNodeAtTail(head.next, data);
    }

    /* This will put all the head nodes on the stack and then pop them off at the end */ 
    return head;
 }

非常感谢任何建议,

4 个答案:

答案 0 :(得分:3)

只需这样做

public Node insertNodeAtTail(Node head, int data) {
 if(head == null) {
    head = new Node(data);
 }
 else{
    head.next = insertNodeAtTail(head.next,data);
 }
 return head;
}

答案 1 :(得分:2)

你只是将返回放在错误的地方,并返回相同的头元素。

else {
/* Travese the list by passing the next node in the list until next is NULL */
    return insertNodeAtTail(head.next, data);
}

我是从头上写的,请检查。

答案 2 :(得分:1)

是的,你的理解是正确的......:)

答案 3 :(得分:1)

上次返回会导致问题,因为它会导致Head始终指向列表的倒数第二个节点。您应该按照FallAndLearn的建议删除它。如果我错了,请纠正我。