簡體   English   中英

選擇排序雙鏈表Java

[英]Selection sort Doubly linked list java

我需要使用選擇排序對鏈接列表進行排序。 但是我不能使用收藏集。 我很難找到最小的元素並創建新版本的排序列表。 謝謝。

    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方法無法正常工作, findSmallest Sort方法無法正常工作。 我試圖通過創建一個新列表來實現排序,在該列表中我將Nodes進行排序。 而且它也不會超出“ While loop”

        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;
        }
    }

沒有雙向鏈接列表可能會有所幫助,因為這樣一來,您需要維護的鏈接就會減少。 另外,您可能在findSmallest()方法上遇到麻煩,因為您最初將當前和最小設置為同一節點,因此當執行if(smallest.student.name.compareToIgnoreCase(current.student.name)> 0)語句時您正在將學生的姓名與學生的姓名進行比較。 例如,如果將最小的節點設置為具有John的學生名,那么current當前被設置為同一節點,因此current的學生名也是John。 如果他們是同名的不同學生,但在您的代碼中他們是同一學生,並且當前和最小指向同一節點,這不是問題。 實際上,此if語句始終會為false,並且您將永遠不會執行代碼以使電流沿列表移動。 這就是為什么當您設置minimum = last時,該方法至少在某些時候有效。

如上所述,嘗試類似

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

將其轉換為代碼應該不太難

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM