插入已排序的双向链表

时间:2013-10-20 21:45:31

标签: java insert linked-list sorted

我知道这并不复杂,但出于某种原因,我无法弄明白。

我正在尝试将元素插入到双向链表中,并保持一切排序。 我查了几个与此类似的不同问题,但似乎没有一个完全相同。

简单地说,如果我有一个双重链表: 3 - < - > 4 - < - > 5 - < - > 7 - < - > 8

insertMid(6): 3 - < - > 4 - < - > 5 - < - > 6 - < - > 7 - < - > 8

public void insert(IndexRecord newRec){
    Node newNode = new Node(newRec);
    Node curNode = front;

    if (isEmpty()){                             //Empty list
        front = newNode;
    }else if (front.getNext() == null){         //One element in list
        newNode.setPrev(front);
        front.setNext(newNode);
        back = newNode;
        back.setPrev(front);    
    }else if (back.compareTo(newNode) < 0){     //New node is greater than back
        back.setNext(newNode);
        newNode.setPrev(back);
        back.getPrev().setNext(newNode);
        back = newNode;
    }else{                                      //New node is in between two others
        while (curNode != null){
            if (newNode.compareTo(curNode) < 0){
                curNode = curNode.getNext();
            }else{
                break;
            }
        }
        newNode.setNext(curNode);
        newNode.setPrev(curNode.getPrev());
        curNode.getPrev().setNext(newNode);
        curNode.setPrev(newNode);
    }
}

它只是给我一个NPE就行curNode.getNext()。setPrev(newNode());但是如果我在我的while循环调试中检查它会怎么样呢?

1 个答案:

答案 0 :(得分:2)

两个问题:

  1. 你打破curNode == newNode(在值中):

    curNode.getData().getKey().compareTo(newRec.getKey()) == 0

    但是在示例中你提供了6!= 5和6!= 7实际上,只要当前节点的值小于新节点,就应该“向前移动”

  2. 你做了两个相互矛盾的行动:
    • newNode.setNext(curNode);
    • curNode.setNext(newNode);
  3. 考虑一下您给出的示例,您应该使用新节点6运行,直到达到7.一旦到达第一个更大的节点,您应该执行以下4个操作:

    - update 6's next to point to 7
    - update 6's prev to point to 5
    - update 5's next to point to 6
    - update 7's prev to point to 6
    

    请记住,根据此算法,“current”应指向7(newNode为6),因此您应该这样做:

    newNode.setNext(curNode);
    newNode.setPrev(curNode.getPrev());
    curNode.getPrev().setnext(newNode);
    curNode.setPrev(newNode);
    

    重要:
    newNode最小/最大的情况怎么样?你应该处理这两个边缘情况 - 否则你会得到NPE!