【问题标题】:insertion sort on linked list链表上的插入排序
【发布时间】:2013-08-08 02:15:33
【问题描述】:

//我为双向链表上的插入方法编写了java代码,但是//当我运行它时有一个无限循环。我试图找到一个错误,但到目前为止还没有找到。有什么建议么? //它正在调用一个辅助函数

 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;

}

【问题讨论】:

    标签: doubly-linked-list insertion-sort


    【解决方案1】:

    您的代码有点难以阅读,但我注意到了一些问题

    第一: 处理在列表头部插入数字的情况:

    if(q.myItem>=head.myItem){
            DListNode te=head;
            q.myNext=te;
            te.myPrev=q;
            q=head;
            return head;
        }
    

    特别是q=head; 行和返回。 q=head 可以删除,它应该返回 q 而不是 head,因为 q 是新的 head。我想你的意思是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;
        }
    

    最后确保 myPrev 和 myNext 在 DListNode 的构造函数中正确初始化为 null。

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


    一些风格说明(只是一个旁注):

    1. 在我看来,重复的 if->return 格式并不是最干净的。 我通常会尝试限制函数中的退出点
    2. 中间变量很多,名字超级棒 模糊的。至少尝试使用一些更具描述性的 变量名。
    3. cmets 总是一个好主意。只要确保他们不只是解释代码在做什么 - 而是尝试并 传达思考过程和想要完成的任务。

    【讨论】:

    • 谢谢。我修复了错误,现在它可以工作了。您能否详细说明为什么 myTail 没有按我的预期工作。我仍然不确定。我删除了 myTail 并按照您的建议进行了更改。
    • 我假设 myTail 最初指向未排序列表中的最后一个节点。 temp 被创建为指向myTail,并被用作插入q 的基础。真正发生的事情是您将q 附加到未排序(输入)列表的末尾,因此该列表可能会继续增长和重新评估节点。我建议用一些指向节点的指针勾勒出一个列表,以便直观地浏览它。如果此回复回答了您的问题,请“接受”它作为答案,以便将问题标记为已回答。
    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多