在链表上插入排序

时间:2013-08-08 02:15:33

标签: doubly-linked-list insertion-sort

//我在双向链表上编写了插入方法的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;

}

1 个答案:

答案 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。

免责声明我没有机会测试我在这里添加的代码,但希望它至少让您考虑解决方案。


几个风格笔记(只是旁注):

  1. 重复的if-&gt;返回格式在我看来并不是最干净的。 我通常会尝试限制函数中的退出点
  2. 使用了很多中间变量,名称是超级的 暧昧。至少尝试使用一些更具描述性的内容 变量名称。
  3. 评论总是一个好主意。只要确保他们不只是解释代码正在做什么 - 而是尝试和 传达思考过程和想要完成的事情。