java - 查找单链表的倒数第 k 个元素

标签 java recursion pass-by-reference pass-by-value singly-linked-list

对于 Java 中的“单链表的第 k 到最后一个元素”问题,我有两个递归解决方案:

解决方案一:

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 值包装在一个类中并传递它。

我有两个问题:

  1. 为什么第一个解决方案在 Java 中不起作用?为什么在每个方法调用中通过局部变量 i 的按值传递与按引用传递版本的工作方式不同?

  2. Java中的Integer类包装了int,但是将int替换为Integer第一个解决方案也不起作用。为什么?

最佳答案

1. 第一个解决方案不起作用,因为每次您在 i 变量中传递相同的值。如果将 i = i + 1 行移动到 Node n = nthToLast (head.next, k, i) 行上,一切都应该没有问题。
2. Integer 类是不可变的,因此表现得像普通的 int。这就是为什么如果您在第一个解决方案中使用 Integer 函数将无法正常工作。您可以替换我上面提到的第一个解决方案使用 Integer 的代码行。
第二种解决方案有效,因为递增计数器的方式不会覆盖对计数对象的引用。

关于java - 查找单链表的倒数第 k 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20740634/

相关文章:

java - 查询时区 - 数据库服务器和客户端机器有不同的时区

java - 有没有办法用 Java 运行和控制另一个程序? (或 C++)

java - 在android中滚动时如何调整图像大小?

java - 堆栈溢出错误

perl - @_ 在 Perl 子程序中是如何工作的?

Java内部类和静态嵌套类

java - 返回字符串的扫描仪对象中数字的逆序(java)

c++ - 递归模板不能像预期的那样使用静态变量

c++-cli - 在 C++/CLI 中通过引用传递参数,因此重新分配会影响调用者

c++ - 指针类型引用