java - 选择排序链接列表

标签 java sorting linked-list

我正在双向链表中实现选择排序。 我必须通过查找最小元素并将其插入列表的开头来按姓氏对列表进行排序。 但是有一些麻烦,当我运行我的程序时,在 while 循环中的排序方法中出现 NIL 异常。 它是整个应用程序,因此您可以根据需要编译并运行它。 帮助将不胜感激。 谢谢。

    public class LinkedList {
        public Node first;
        public Node last;

        public LinkedList() {
            first = null;
            last = null;
        }

        public void addFirst(Student student) {
            Node f = first;
            Node newNode = new Node(student);
            first = newNode;
            if (f == null) last = newNode;
            else {
                f.previous = newNode;
                newNode.next = f;
            }
        }

        public void addLast(Student student) {
            Node l = last;
            Node newNode = new Node(student);
            last = newNode;
            if (l == null) first = newNode;
            else {
                l.next = newNode;
                newNode.previous = l;
            }
        }

        public void display() {
            Node current = first;
            while (current != null) {
                System.out.print(current.student.name + "\b");
                System.out.print(current.student.surname + "\b");
                System.out.println(current.student.educationType);
                current = current.next;
            }
        }

        public Node findSmallest(Node startNode) {
            Node smallest = startNode;
            while (startNode.next != null) {
                if (smallest.student.surname.compareToIgnoreCase(startNode.next.student.surname) > 1)
                    smallest = startNode.next;
                else startNode = startNode.next;
            }
            return smallest;
        }

        public void Sort() {
            LinkedList newList = new LinkedList();
            Node current = first;

            while (current.next != null) {
                Node smallest = findSmallest(current);
                newList.addLast(smallest.student);
                delNode(smallest);
                current = current.next;

            }
            first = newList.first;
            last = newList.last;
        }

        public void delNode(Node toDel) {
            if (toDel.previous == null) {
                toDel.next.previous = null;
                first = toDel.next;
                return;
            }

            if (toDel.next == null) {
                toDel.previous.next = null;
                last = toDel.previous;
                return;
            }
            toDel.previous.next = toDel.next;
            toDel.next.previous = toDel.previous;
        }

}


public class Student {
    public String name;
    public String surname;
    public String educationType;

    static public Student createStudent() {
        Student student = new Student();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Enter student's name:");
            student.name = br.readLine();
            System.out.println("Enter surname:");
            student.surname = br.readLine();
            System.out.println("Enter educational type:");
            student.educationType = br.readLine();
        } catch (IOException e) {
            throw new NotImplementedException();
        }
        return student;
    }
}


public class Node {
    public Student student;

    public Node next;
    public Node previous;

    public Node(Student student) {
        this.student = student;
    }
}

最佳答案

我没有运行它,所以这只是通过查看你的代码:

  1. 这并不是真正的选择排序,因为您正在构建新列表,而不是对旧列表进行排序。

  2. delNode() 对于单个元素列表将因 NPE 失败,所以也许这就是问题所在(如果您删除最后一个元素,它也会失败)。

  3. 除非不允许,否则请使用哨兵。

关于java - 选择排序链接列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7940705/

相关文章:

java - Android 命名约定中的匈牙利表示法

java - 如何随机选择一个枚举值?

java - 如何在java中按两列对csv文件进行排序?

python - 使用两个列表排序产生的排序对第三个列表进行排序?

c# - 具有通用实现的单链表

java - 在使用 docx4j 生成的 .docx 中水平居中图像

java - 负输入的验证

java - 为相同的 azure 位置获取不同的格式

c++ - 在 C++ 中创建链表

c++ - 使用 nullptr 终止迭代器