调用方法后,
node.nth(5)
在下面的代码中,
public class List_Node {
int item;
List_Node next;
public List_Node() {
this.item = 0;
this.next = null;
}
public List_Node(int item, List_Node next) {
this.item = item;
this.next = next;
}
public List_Node(int item) {
this(item, null);
}
public void insertAfter(int item) {
this.next = new List_Node(item, this.next);
}
public List_Node nth(int position) {
if (position == 1) {
return this;
} else if((position < 1) || (this.next == null)) {
/* error checking */
return null;
} else {
return this.next.nth(position - 1);
}
}
public static void main(String[] args){
List_Node node = new List_Node(0);
List_Node temp = node;
for (int item = 1; item < 5; item++) {
temp.insertAfter(item);
temp = temp.next;
}
System.out.println(node.nth(5).item);
}
}
下面是我在4次递归调用后可以想象的nth()
方法的堆栈帧。
我的问题:
根据上图,假设活动记录S5
的实例值为pos
为1
,我想了解一下,当java执行时会发生什么{ {1}}?
java是否将return this
中this
的值指定为S5
中this
的值?因为S4
方法的else{}
块中没有赋值语句(如此)。
注意:请忽略Java编码风格,因为我是新学员。
答案 0 :(得分:8)
每次调用this.next.nth()
时,都会在完全不同的对象上调用nth()
方法。您的this
将引用该新对象(在之前的堆栈中为next
)。它不是一个纯粹的递归。试想一下,如果你在某个不同的对象上调用不同的方法。
因此position=1
时this
会引用S5
。
<强>更新强> 让我们说你的List_Nodes是这样链接的 10→20→; 30-&GT; 40-→50
每当你从main打电话给node.nth(5)
时,
Stack 1: position 5, this points to 10 (you are calling this.next.nth(4); means 20.nth())
Stack 2: position 4, this points to 20 (calling this.next.nth(3); = 30.nth())
Stack 3: position 3, this points to 30 (calling this.next.nth(2) = 40.nth())
Stack 4: position 2, this points to 40 (calling this.next.nth(1) = 50.nth())
Stack 5: position 1, this points to 50 (returning this; this here is 50)
returns 50
returns 50 (not going back into if, so return value remains same)
returns 50
returns 50
returns 50
在讨论聊天时,在图片中描述了同样的情况。在此处添加,以便将来的读者受益。
另一个更新
No assignment variable in else as such
你可以写这个像
List_Node temp = this.next.nth(position-1);
return temp;
一般情况下,我们需要将List
和Node
类分开,List
应该有head
,而Node
会有item
}和next
指针。就像java中的LinkedList
一样。然后,nth()
方法将位于List
类中,它只会迭代它直到您到达nth
元素。