这是代码
public static ListCell reverse(ListCell f) {
if (f==null)
return null;
else if (f.getNext()==null)
return f;
else {
ListCell head = reverse(f.getNext());
f.getNext().setNext(f);
f.setNext(null);
return head;
}
}
我对f.setNext(null)
感到困惑。考虑第二个递归调用reverse(f.getNext())
。但f.getNext().next
应该是f
,而不是null
。这句话会将node.next
设置为null
。所以我很困惑
答案 0 :(得分:0)
当进入反向函数时,函数递归调用自身,直到参数f是列表的最后一个元素(由f.getNext () == null
表示)
像a -> b -> c
第一次评估f.getNext().setNext(f)
f
是列表的倒数第二个元素,head是最后一个元素。
head = reverse(f.getNext())
头部为c
当f.getNext().setNext(f)
被调用时,f指向给定示例中的ListCell b
。
所以就像这个电话b.getNext().setNext(b)
在a-> b <- c
之后,列表看起来像b.setNext(null)
。之后,函数返回c
,因为head
指向c
。
爬上堆栈head
后仍然指向c
,因为它是递归调用返回的,但f是a
。
因此a.getNext().setNext(a)
会将b
的下一个值设置为a,因为a.getNext()
仍然指向b
。
在a.setNext(null)
后,列表看起来像c->b->a