【问题标题】:Insert into sorted Doubly Linked List插入已排序的双向链表
【发布时间】:2023-04-07 17:19:01
【问题描述】:

我知道这并不复杂,但由于某种原因我无法弄清楚。

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

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

插入中间(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);
    }
}

它只是在 curNode.getNext().setPrev(newNode()); 行上给了我一个 NPE但是如果我在我的 while 循环条件中检查它怎么会发生呢?

【问题讨论】:

  • 我们能看到完整的堆栈跟踪吗?此外,异常报告给出的行号并不总是正确的,因此可能不是正确的行。
  • @tbodt:他们什么时候不正确?
  • 在 COSC311Driver.main(COSC311Driver.java: 48)
  • 一旦curNode.getNext() null...,循环就会终止
  • 第 43 行就是我说的那一行

标签: java insert linked-list sorted


【解决方案1】:

两个问题:

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

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

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

  2. 您正在执行两个相互矛盾的操作:
    • newNode.setNext(curNode);
    • curNode.setNext(newNode);

考虑您提供的示例,您应该使用新节点 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!

【讨论】:

  • 是的,我注意到这些问题并在您发布此内容之前对其进行了纠正,但我仍然在 curNode.getPrev().setNext(newNode);行,即使我添加了对边缘情况的检查
  • @Nexion 如果你检查了所有你不应该得到 NPE 的边缘情况......只有两个选项:curNode 为空或curNode.getPrev() 为空。使用调试器运行并找出是哪种情况。
  • 用我修改过的代码更新了 OP,它仍然在同一行上给了我一个 NPE……出于某种原因,curNode 永远不会改变,只是前面。我不知道为什么......
  • @Nexion 你在这里可能有不止一个错误。示例:当 front.getNext() == null 你设置 newNode.setPrev(front);不检查其中哪一个更大。
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多