【问题标题】:How to add elements in a Linked list by recursion?如何通过递归在链表中添加元素?
【发布时间】:2017-07-27 19:39:52
【问题描述】:

我创建了一个名为“add”的私有递归方法,它应该递归地添加元素,但它不起作用。我知道java没有按引用传递,那么如何递归添加元素?如果你能告诉我我错在哪里,那就太好了。谢谢

public class linkedIt2 {
private int length = 0;
private Node head;


private class Node {
    Node next;
    int data;
    public Node(int data, Node next) {
        this.data = data;
        this.next = next;
    }

    public Node(int data) {
        this.data = data;
        this.next = null;
    }
}


public linkedIt2() {
    head = null;
}

private void add(Node cur, int data) {
    if (cur != null) {
        add(cur.next, data);
    } else {
        cur = new Node(data, null);
    }
}

public linkedIt2 insert(int data) {
    add(this.head, data);
    length++;
    return this;
}
}

【问题讨论】:

  • “不工作”是什么意思?

标签: java recursion linked-list


【解决方案1】:

问题是,您无法更改引用。 cur.next 永远不会改变,因为引用是按值调用的。您需要在递归调用之前更改 cur.next。

您需要了解“按值调用”的Java概念,没有按引用调用。引用作为值传输,因此更改引用参数本身,原始使用的对象不会发生任何事情。 也许: http://javadude.com/articles/passbyvalue.htm 让它更清晰。

一种解决方案:类似于您的:

最初您必须确保 cur 不为空。然后您可以在函数内访问 cur.next 。如果为null,则结束递归,如果不是,则继续深入。

private void add(Node cur, int data) {
  if (cur.next != null) {
    add(cur.next, data);      
  } else {
    cur.next = new Node(data, null);
  }
}

public linkedIt2 insert(int data) {
  if (this.head == null) {
     this.head = new Node(data, null);
  } else {
     add(this.head, data);
  }
  length++;
  return this;
}

或让 Node 进行递归并自行操作。正如其他解决方案所述。那更好。

【讨论】:

  • 但是如果我不能引用它,我该如何在递归调用之前更改 cur.next?
  • 非常感谢。一个问题,为什么当我通过 cur.next 时,它可以工作,但当我通过 cur 时却不行?两者都不是按值调用的吗?
  • 只有当你有对象 cur 的 reference 可用时,你才能操作 next。传递的引用本身你不能改变,引用指向的东西,你可以改变。如果调用中的对象是按值传递的(如在 C 或 C++ 中),则情况并非如此。因为您只会更改副本。这在 Java 中是不可能的。对象总是作为引用传递。
【解决方案2】:

你的错误在这里

cur = new Node(data, null);

当您调用它时,它会更新局部变量 cur 以指向一个新节点,这实际上不会导致您调用该方法的变量更新。举个更简单的例子

public static void setToFive(int num) {
    num = 5;
    System.out.println(num); //Always prints 5
}

public static void test() {
    int test = 3;
    setToFive(test);
    System.out.println(test); //Still prints 3 since only num was updated, not test
}

所以要返回原始问题并递归添加元素,您可以执行类似的操作

private class Node {
    //...
    public void add(int data) {
        if (next == null) {
            next = new Node(data, null);
        } else {
            next.add(data);
        }
}

然后只需调用 head.add(data) 并增加您的长度计数器。

这个版本工作得更好,因为当它创建新节点时,它将类的实例变量设置为指向它,而不是方法中包含的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多