我正在学习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;
}
}
答案 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;否则,将其插入列表的延续部分。