当前位置: 首页 > 知识库问答 >
问题:

排序双向链表中的插入

黄朗
2023-03-14

给我一个指向排序双向链表的头节点的指针和一个插入到列表中的整数。我被告知创建一个节点并将其插入到列表中的适当位置,以保持其排序顺序。头节点可能是NULL。

样本输入

空,数据=2

NULL

样本输出

NULL

NULL

我试过上面的问题。但我的程序因超时而终止。在下面的代码中,我做错了什么。假设节点类和主函数已经存在。非常感谢!!

Node SortedInsert(Node head,int data) {

    Node newn = new Node();

    newn.data = data;
    newn.prev=null;
    newn.next = null;

    Node ptr = head;
    Node nex=head.next;

    while(ptr!=null && nex!=null) {
        if(ptr.data<=newn.data && nex.data>=newn.data) {
            newn.next = nex;
            newn.prev = ptr;
            nex.prev = newn;
            ptr.next = newn;
        }            
        else {
            nex=nex.next;
            ptr=ptr.next;
        }
    }

    if(ptr!=null && nex==null) {
        if(ptr.data>=newn.data) {
            newn.next=ptr;
            ptr.prev=newn;
            newn.prev=null;
            head=newn;
        }
        else {
            ptr.next=newn;
            newn.prev = head;
        }
    }

    if(head==null) {
        head = newn; 
    }

    return head;

}

共有2个答案

陈富
2023-03-14

如果head节点为null,则在尝试获取next/prev节点时,将获得一个NullPointerException。你应该先检查一下:

Node sortedInsert(Node head, int data) {
    Node newn = new Node();
    newn.data = data;
    //Basic case: the list is empty, so the head is null
    if (head==null) {
        return newn;
    }
    //If node is not null
    Node aux= head;
    Node auxPrev;
    while (aux!=null && aux.data<data) {
        auxPrev=aux;
        aux=aux.next;
    }
    //auxPrev will be null if we are going to insert in the first position
    if (auxPrev!=null)
        auxPrev.next=newn;
        newn.prev=auxPrev;
        head=newn;
    }
    //aux will be null if we insert in the last position
    if (aux!=null) {
        aux.prev=newn;
        newn.next=aux;
    }
    return head;
}
魏誉
2023-03-14

相当简单:在成功插入后,您没有跳出循环。因此,它会在插入节点的位置上继续循环。做一个微小的改变:

if(ptr.data>=newn.data)
{
    newn.next=ptr;
    ptr.prev=newn;
    newn.prev=null;
    head=newn;
    break;
}

但是,您编写了一些冗余代码。此代码更短,不包含冗余代码:

Node SortedInsert(Node head,int data) {

    Node newn = new Node();
    newn.data = data;  

    Node ptr = head;

    if (ptr == null) {
        head = newn;

    } else if ( ptr.data > newn.data ) {
        newn.next = ptr;
        ptr.prev = newn;
        head = newn;

    } else {
        Node nex = head.next;

        while (nex != null && nex.data <= newn.data) {
            ptr = nex;
            nex = nex.next;
        }

        ptr.next = newn;
        newn.prev = ptr;

        if (nex != null) {
            nex.prev = newn;
            newn.next = nex;
        }
    }

    return head;   
}
 类似资料:
  • 我试图在C中的双向链表上做插入排序。在这种状态下,我的代码让我陷入了一个没有结束的循环,吐出了8和9。 有人能好心解释一下“插入排序”方法是如何设计的吗? 我的链表是设计包含头,上一个,下一个和一些数据。 到目前为止这是我的代码 我的希望破灭了。请帮忙。

  • 我的程序不断崩溃。我觉得我的逻辑有问题。请帮忙!谢谢

  • 我有一个带有前哨节点的双向链表,我需要用O(n^2)复杂度的插入排序来排序。我已经写了这段代码,但它并没有像它应该的那样工作。 对于插入排序,特别是代码,有什么帮助吗? 大小是我的列表中有多少个元素。我的哨兵有var=-1,所以当我处于头部时我想停止,这就是为什么我使用这个。 和只要我们处于某个位置,它就是真的!=哨兵节点。 在具体的例子中,我的列表中有35个整数: 5 9 1 1 1 1 1 1

  • 因此,我对数据结构很陌生,我在对数组进行排序时,在尝试了几天之后,我偶然发现了双链表的插入排序。我仍然无法理解排序有什么问题,是的,我已经在线检查过,我不能只插入排序,我需要对函数参数中传递的列表进行排序,它的名称是internationSort(Dlinkedlist-arr)。 ` ` 我尝试实现它,但我被困住了,因为处理数组的逻辑有点不同,因为我们正在使用 next 和 prev 指针,这使

  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 本文向大家介绍C#双向链表LinkedList排序实现方法,包括了C#双向链表LinkedList排序实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#双向链表LinkedList排序实现方法。分享给大家供大家参考。具体如下: 1.函数 打印链表函数PrintLinkedList 和 排序函数SortLinkedList 注:下面代码中的链表每项都是double类型,如果换做其他