我正在使用递归在链表的末尾插入一个节点。代码工作正常。但我对退货声明有点困惑。
逐一了解我的理解:
第一个返回将返回一个新节点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;
}
非常感谢任何建议,
答案 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的建议删除它。如果我错了,请纠正我。