//我在双向链表上编写了插入方法的java代码,但是当我运行它时有一个无限循环//。我试图找到一个bug,但到目前为止还没有找到。有什么建议? //它正在调用辅助函数
public IntList insertionSort ( ) {
DListNode soFar = null;
for (DListNode p=myHead; p!=null; p=p.myNext) {
soFar = insert (p, soFar);
}
return new IntList (soFar);
}
// values will be in decreasing order.
private DListNode insert (DListNode p, DListNode head) {
DListNode q=new DListNode(p.myItem);
if(head==null){
head=q;
return head;
}
if(q.myItem>=head.myItem){
DListNode te=head;
q.myNext=te;
te.myPrev=q;
q=head;
return head;
}
DListNode a;
boolean found=false;
for(a=head; a!=null;){
if(a.myItem<q.myItem){
found=true;
break;
}
else{
a=a.myNext;
}
}
if(found==false){
DListNode temp=myTail;
temp.myNext=q;
q.myPrev=temp;
myTail=q;
return head;
}
if(found==true){
DListNode t;
t=a.myPrev;
a.myPrev=q;
t.myNext=q;
q.myPrev=t;
q.myNext=a;
}
return head;
}
答案 0 :(得分:1)
您的代码有点难以阅读,但我注意到了一些问题
<强>第一强>: 处理您在列表头部插入数字的情况:
if(q.myItem>=head.myItem){
DListNode te=head;
q.myNext=te;
te.myPrev=q;
q=head;
return head;
}
具体是行q=head;
和返回。可以删除q=head
,并且应该返回q
而不是头,因为q
是新头。我认为你打算做的是head=q; return head;
。当前的代码实际上会在前面添加新节点,但永远不会返回更新的头部,因此它们会在某种程度上“脱离边缘”。
<强>第二强>:
我假设myTail
是一个节点引用,你将myHead
保留在原始列表中。我不认为你想要使用它就像你正在构建的排序列表。当您循环查找要在新列表中插入的位置时,使用它来确定尾部引用并改为使用它。
DListNode lastCompared = null;
for(a=head; a!=null; a=a.myNext) {
lastCompared = a;
if(a.myItem<q.myItem) {
break;
}
}
if( a )
{
// insert node before a
...
}
else
{
// smallest value yet, throw on the end
lastCompared.myNext = q;
q.myPrev = lastCompared;
return head;
}
最后确保在DListNode的构造函数中将myPrev和myNext正确初始化为null。
免责声明我没有机会测试我在这里添加的代码,但希望它至少让您考虑解决方案。
几个风格笔记(只是旁注):