在Java中使用一种方法对单链表进行排序

在Java中使用一种方法对单链表进行排序,java,list,sorting,Java,List,Sorting,实现一个链表,最多可存储10个名称,按先进先出的顺序排列。然后实现两种方法,其中一种按姓氏的字母顺序排序。这就是我遇到麻烦的地方。以下是我尝试过的: 递归。该方法调用两个节点,比较它们,根据需要交换,然后调用自身。不能处理奇数个名称,而且往往是完全错误 收集,但我对它了解不够,无法有效地使用它 排序算法(例如气泡排序):我可以浏览列表,但很难让节点交换 我的问题是:最简单的方法是什么 public class List { public class Link {

实现一个链表,最多可存储10个名称,按先进先出的顺序排列。然后实现两种方法,其中一种按姓氏的字母顺序排序。这就是我遇到麻烦的地方。以下是我尝试过的:

  • 递归。该方法调用两个节点,比较它们,根据需要交换,然后调用自身。不能处理奇数个名称,而且往往是完全错误

  • 收集,但我对它了解不够,无法有效地使用它

  • 排序算法(例如气泡排序):我可以浏览列表,但很难让节点交换

  • 我的问题是:最简单的方法是什么

    public class List
    {
        public class Link
        {
            public String firstName;
            public String middleName;
            public String lastName;
            public Link next = null;
    
        Link(String f, String m, String l)
        {
            firstName = f;
            middleName = m; 
            lastName = l;
        }
    }
    
    private Link first_;
    private Link last_;
    
    List()
    {
        first_ = null;
        last_ = null;
    }
    
    public boolean isEmpty()
    {
        return first_ == null;
    }
    
    public void insertFront(String f, String m, String l)
    {
        Link name = new Link(f, m, l);
        if (first_ == null)
        {
            first_ = name;
            last_ = name;
        }
        else
        {
            last_.next = name;
            last_ = last_.next;
        }
    }
    
    public String removeFront()
    {
        String f = first_.firstName;
        String m = first_.middleName;
        String l = first_.lastName;
        first_ = first_.next;
        return f + " " + m + " " + l;
    }
    
    public String findMiddle(String f, String l)
    {
        Link current = first_;
        while (current != null && current.firstName.compareTo(f) != 0 && current.lastName.compareTo(l) != 0)
        {
            current = current.next;
        }
        if (current == null)
        {
            return "Not in list";
        }
        return "That person's middle name is " + current.middleName;
    }
    }
    
    public class NamesOfFriends
    {
        public static void main(String[] args)
        {
            List listOfnames = new List();
            Scanner in = new Scanner(System.in);
    
        for(int i = 0; i < 3; i++)
        {
            if(i == 0)
            {
                System.out.println("Please enter the first, middle and last name?");
                listOfnames.insertFront(in.next(), in.next(),in.next());
            }
            else
            {
                System.out.println("Please enter the next first, middle and last name");
                listOfnames.insertFront(in.next(), in.next(),in.next());
            }
        }
    
        System.out.println("To find the middle name, please enter the first and last name of the person.");
        System.out.println(listOfnames.findMiddle(in.next(),in.next()));
        }
    }
    

    2:收集是最容易的,但你的家庭作业中似乎不允许收集

    3:BubbleSort很简单,但它是已知最差的排序算法,不过对于你的家庭作业来说,它可能还可以

    1:这与冒泡排序相同,但最好不使用递归进行排序


    在BubbleSort中,您一次又一次地循环您的元素,直到不再需要交换,然后您就准备好了。

    2:收集是最简单的,但在您的家庭作业中似乎不允许这样做

    3:BubbleSort很简单,但它是已知最差的排序算法,不过对于你的家庭作业来说,它可能还可以

    1:这与冒泡排序相同,但最好不使用递归进行排序


    在BubbleSort中,您一次又一次地循环您的元素,直到不再需要交换,然后您就准备好了。

    收集是实现这一点的最简单方法

    • 实施可比的
    • 覆盖
      hashcode
      等于
    • Collection.sort()

    收集是实现这一点的最简单方法

    • 实施可比的
    • 覆盖
      hashcode
      等于
    • Collection.sort()

      • 您已经实现了链表,这很好

        您是否考虑过实现MergeSort作为排序算法?作为分而治之的算法,您将始终只使用两个元素来形成一个列表

        合并部分将更加复杂,但也很容易。基本上,您只需创建一个新列表,并开始使用通过比较两个合并集的第一个值得到的元素填充它

        例如,如果要合并两个集合:

        [A]->[C]->[D]
        [B]->[E]->[F]
        
        梅金过程将是:

        [A]
        
        [C]->[D]
        [B]->[E]->[F]
        






        您已经实现了链表,这很好

        您是否考虑过实现MergeSort作为排序算法?作为分而治之的算法,您将始终只使用两个元素来形成一个列表

        合并部分将更加复杂,但也很容易。基本上,您只需创建一个新列表,并开始使用通过比较两个合并集的第一个值得到的元素填充它

        例如,如果要合并两个集合:

        [A]->[C]->[D]
        [B]->[E]->[F]
        
        梅金过程将是:

        [A]
        
        [C]->[D]
        [B]->[E]->[F]
        






        请不要使用家庭作业标签。请不要使用家庭作业标签。
        [A]->[B]->[C]
        
        [D]
        [E]->[F]
        
        [A]->[B]->[C]->[D]
        
        [E]->[F]
        
        [A]->[B]->[C]->[D]->[E]
        
        [F]
        
        [A]->[B]->[C]->[D]->[E]->[F]