【问题标题】:Inserting Node in a Sorted linked list在有序链表中插入节点
【发布时间】:2014-10-07 06:08:35
【问题描述】:

以下代码确保元素以排序方式插入到链表中。

在了解了这背后的逻辑后,我决定自己测试一下。但是,当我编写我的代码版本时,如下所示。

  public class SortedList {

    private Node first;

    public SortedList() {
        first = null;
    }

    public boolean isEmpty() {
        return first == null;
    }

    public void insert(int j) {
        Node newNode = new Node(j);
        Node previous = null;
        Node current = first;

        while (current != null && j > current.iData) {
            previous = current;
            current = current.next;
        }

        if (previous == null)
            first = newNode;

        else

            newNode.next = current;
        previous.next = newNode;

    }

    public Node remove() {
        Node temp = first;
        first = first.next;
        return temp;
    }

    public void displayList() {
        System.out.println("First to -----> Last");
        Node current = first;

        while (current != null) {
            current.display();
            current = current.next;
        }
    }

}

节点类

public class Node {

    public int iData;
    public Node next;

    public Node(int id) {
        iData = id;
    }

    public void display() {
        System.out.println(iData + " ");
    }

}

测试班

public class SortedListApp {

    public static void main(String[] args) {

        SortedList list = new SortedList();

        list.insert(20);
        list.insert(40);

        list.displayList();

        list.insert(10);
        list.insert(30);
        list.insert(50);

        list.displayList();

        list.remove();

        list.displayList();

    }

}

两者之间的唯一区别是在我的版本中,当 while 循环终止时。我首先将 newNode 的下一个值设置为当前值,然后将previous 的下一个值设置为新节点。在发布的原始代码中,他们将其反转。由于某种原因,这会引发空指针异常。我想知道为什么?

据我了解,一旦新节点找到插入位置。我们引用了前一个节点和当前节点,我们试图将新节点插入前一个节点和当前节点的中间。因此我所做的就是将新节点的下一个节点设置为当前节点,然后将前一个节点的下一个节点设置为新节点。

请告诉我哪里错了。

【问题讨论】:

    标签: java data-structures linked-list


    【解决方案1】:

    previous 为空时跟踪这段代码:

    if (previous == null)
        first = newNode;
    else
        newNode.next = current;
    previous.next = newNode;
    

    请注意,您实际上从未在if 语句中更改previous,因此这将尝试写入nullnext 字段,从而导致崩溃。

    如果previous 为空,则需要将节点添加到列表中,在这种情况下,您只需将first 设置为newNode,并使newNode 的下一个指针指向旧名单。在previous 不是null 的情况下,您需要进行两次重新布线:您需要使previous.next 指向新节点,并使新节点的next 指针指向当前节点。您可以通过编写来解决此问题

    if (previous == null) {
        newNode.next = current;
        first = newNode;
    }
    else {
        newNode.next = current;
        previous.next = newNode;
    }
    

    等价:

    newNode.next = current;
    if (previous == null)
        first = newNode;
    else
        previous.next = newNode;
    

    希望这会有所帮助!

    【讨论】:

    • 我理解你的逻辑,我试过了。尽管我的程序没有崩溃,但由于某些值未正确插入,因此无法正常运行。唯一一次它工作得很好是当我首先将前一个节点设置为下一个节点,然后将新节点的下一个节点设置为当前节点。
    • 按照您在问题中输入的示例代码是否有效?
    • 如果我切换 newNode.next = current; 的顺序就可以了和 previous.next = newNode;
    • 您知道第一条语句在else 内,而第二条语句无条件执行,对吗?另外,节点的next 指针的默认值是多少?
    • 我复制粘贴了您建议的代码并替换为我的代码,发生的事情是它并没有崩溃,但表现得很奇怪。如果我编辑我的问题并粘贴我的整个代码这样它可以让你更好地帮助我,这很酷吗?我真的坚持这一点,我不想进一步学习,直到我明白这里出了什么问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多