【发布时间】:2014-01-11 12:00:41
【问题描述】:
对于 Java 中的“单链表的第 k 个到最后一个元素”问题,我有两个递归解决方案:
解决方案 1:
public static Node nthToLast(Node head, int k , int i){
if (head == null) return null;
Node n = nthToLast(head.next, k, i);
i = i + 1;
if (i == k) return head;
return n;
}
解决方案 2:
public class IntWrapper {
public int value = 0;
}
public static Node nthToLast(Node head, int k, IntWrapper i){
if (head == null) return null;
Node n = nthToLast(head.next, k, i);
i.value = i.value + 1;
if (i.value == k) return head;
return n;
}
第一个解决方案返回null,而第二个解决方案完美运行。第一个解决方案通过值传递k,而第二个解决方案将int 值包装在一个类中并传递它。
我有两个问题:
为什么第一个解决方案在 Java 中不起作用?为什么在每个方法调用中通过局部变量
i传递值与传递引用版本的工作方式不同?Java 中的
Integer类包装了int,但在第一个解决方案中将int替换为Integer效果不佳。为什么?
【问题讨论】:
-
在您的第一个解决方案中,我没有初始化
-
@Vorsprung 我相信“i”是一个方法参数,虽然我不知道初始调用是什么样的。
-
初始调用如下所示: 第一个解决方案: Node n = nthToLast(testRootNode , 2 , 0);第二种解决方案: Node n = nthToLast(testRootNode , 2 , new IntWrapper());
-
你确定你的解决方案给你第k个到最后一个元素,而不是第k个元素吗?
标签: java recursion pass-by-reference pass-by-value singly-linked-list