以递减顺序递归插入链表

时间:2013-04-10 21:13:00

标签: java recursion linked-list

我正在学习java并尝试实现Java'LinkedList'的insertList方法。我希望它以递归方式和降序工作。我正在阅读一本书的教程,但我仍然坚持这一点。我现在有下面的代码,但是工作不正常。有人可以给我一些建议吗?

说,我们想在'LinkedList'中插入1,3,9,0,5。运行代码后,它应该是'LinkedList'中的9,5,3,1,0。

public class ListElement {
    int value
    ListElement next;
}

public static ListElement InsertList(ListElement head, ListElement elem) { 

    if(head == null){
        elem.next = head;
        return elem;
    }
    else{
        if(elem.value > head.value){
        elem.next = InsertList(elem, head.next);
    }else{
        elem.next = InsertList(head.next, elem);
    }
        return head;
    }
}

2 个答案:

答案 0 :(得分:4)

您的代码有几个问题。测试

      if(elem.next > head){

不应该编译,因为没有为对象定义>运算符。看起来你的递归没有基本情况 - 你在所有情况下递归,这将导致堆栈溢出。最后,应该插入一个值,而不是ListElement的实例。试试这个(我将方法重命名为insertList以符合Java编码约定):

public static ListElement insertList(ListElement head, int value) { 
    ListElement elt;
    if (head == null || head.value <= value) {
        elt = new ListElement();
        elt.value = value;
        elt.next = head;
        return elt;
     } else {
        head.next = insertList(head.next, value);
        return head;
     }
}

插入值而不是ListElement的优点是您可以从客户端代码隐藏列表的实现。此外,由于ListElement可能是整个列表,因此插入ListElement可能会出现意外行为。

答案 1 :(得分:2)

首先,这并不严格,但java约定强制方法​​以小写字母开头。

其次,也许不是插入,而是想调用insertList(你自己的函数),这使得函数递归且合理。

第三,您必须比较值:

if (head == null || elem.value > head.value){
    elem.next = head;
    return elem;
}
else {
    head.next = insertList(head.next, elem);
    return head;
}

这意味着:如果head为null或小于elem,则在start时插入elem;否则,将其插入列表的延续部分。