如何通过递归在链接列表中添加元素?

时间:2017-07-27 19:39:52

标签: java recursion linked-list

我创建了一个名为“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;
}
}

2 个答案:

答案 0 :(得分:2)

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

您需要了解"按值调用"的java概念。没有参考电话。引用被转换为值,因此更改引用参数本身,最初使用的对象没有任何反应。 也许: http://javadude.com/articles/passbyvalue.htm 使它更清楚。

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

最初,您必须确保cur不为null。然后你可以访问函数内的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执行递归并操纵自己。正如其他解决方案所述。那甚至更好。

答案 1 :(得分:0)

你的错误在于

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)并递增长度计数器。

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