【问题标题】:Selection sort Doubly linked list java选择排序双向链表java
【发布时间】:2011-10-25 11:50:32
【问题描述】:

我需要使用选择排序对链接列表进行排序。 但我不能使用集合。 我在查找最小元素和创建新版本的排序列表时遇到了麻烦。 谢谢。

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

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

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

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

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

        public void display() {
            Node current = last;
            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.previous;
            }
        }

由于findSmallest 方法不工作,Sort 方法不能正常工作。我尝试通过创建一个新列表来实现排序,在该列表中以排序方式放置节点。而且它也不会退出“While循环”

        public void Sort() {
            LinkedList list = new LinkedList();
            Node toStart = last;
            while (toStart!=null){
                list.addLast(findSmallest(toStart).student);
                toStart = toStart.previous;
            }


        }

它发送添加的最大元素,如果我手动将“last”分配给“smallest”,它会起作用。

        public Node findSmallest(Node toStartFrom) {
            Node current = toStartFrom;
            Node smallest = toStartFrom; //if i put here `last` it will work correctly
            while(current != null) {
                if (smallest.student.name.compareToIgnoreCase(current.student.name) > 0) smallest = current;
                current = current.previous;
            }
            return smallest;
        }

    }

  public class Node {
        public Student student;

        public Node next;
        public Node previous;

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


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

        static public Student createStudent() {
         ....
            return student;
        }
    }

【问题讨论】:

  • 定义“不工作”。此外,如果这是一项作业,则应将其标记为家庭作业。
  • 是的“不工作”以什么方式? NPE 不工作或随机返回不工作或什么?另外,您是否有任何理由以相反的顺序遍历列表?我觉得 node.next 会是惯例

标签: java sorting linked-list


【解决方案1】:

没有双向链表可能会有所帮助,因为这样您需要维护的链接就会减少。此外,您可能在使用 findSmallest() 方法时遇到问题,因为您最初将当前和最小设置为同一节点,因此当执行 if(smallest.student.name.compareToIgnoreCase(current.student.name) > 0) 语句时您正在将学生的姓名与学生的同名进行比较。例如,如果设置为最小的节点的学生姓名为 John,则将其设置为同一节点,则当前的学生姓名也为 John。如果他们是同名的不同学生,但在您的代码中他们是同一个学生并且当前和最小都指向同一个节点,这不是问题。实际上,此 if 语句始终为假,您将永远不会执行代码以沿列表移动当前。这也是为什么当您设置 minimum = last 时,该方法至少在某些时候确实有效。

【讨论】:

    【解决方案2】:

    如上所述,尝试类似

    smallest = startnode
    next =startnode.next
    while(next != null)
    compare next with smallest, and assign accordingly
    next = next.next

    把它变成代码应该不会太难

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 2014-02-04
      • 2022-01-09
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多