使用方法在Java中对单链接列表进行排序

时间:2012-12-13 21:29:16

标签: java list sorting

实施链接列表,最多可存储10个名称,先在First Out中排序。然后实现两个方法,其中一个方法按姓氏的字母顺序对其进行排序。这是我遇到麻烦的地方。这是我试过的:

  1. 递归。该方法调用两个节点,比较它们,如果需要则交换,然后调用自身。不能使用奇数个名称,并且往往是完整的错误。

  2. 收藏但我不太了解它有效使用它。

  3. 排序算法(例如冒泡排序):我可以查看列表,但很难让节点交换。

  4. 我的问题是:最简单的方法是什么?

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

    修改

    稍微研究一下后,我想出了如何对它进行排序。为此,我试图实现一个删除方法,可以删除列表中任何位置的节点。虽然它确实编译,但在我运行程序时它没有做任何事情。

    public Link remove(String lastName)
    {
        Link current_ = first_;
        Link prior_ = null;
        Link temp_ = null;
        while (current_ != null && current_.lastName.compareTo(lastName) != 0)
        {
            prior_ = current_;
            current_ = current_.next;
        }
        if (current_ != null)
        {
            if (current_ == last_)
            {
                temp_ = last_;
                last_ = prior_;
            }
            else if (prior_ == null)
            {
                temp_ = first_;
                first_ = first_.next;
            }
        }
        else
        {
            temp_ = current_;
            prior_.next = current_.next;
        }
        return temp_;
    }
    

3 个答案:

答案 0 :(得分:1)

2:收藏是最简单的,但似乎不允许在你的作业中

3:BubbleSort很容易,但是最糟糕的排序算法,但是对于你的作业来说它可能没问题

1:这与冒泡排序相同,但优选不进行递归

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

答案 1 :(得分:0)

收集是实现这一目标的最简单方法。

  • 实施Comparable
  • 覆盖hashcodeequals
  • Collection.sort()

答案 2 :(得分:0)

您已经实施了链接列表,这很好。

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

合并部分将变得更加棘手,但也很容易。基本上你只需创建一个新列表,然后通过比较两个合并集的第一个值来开始填充你得到的元素。

因此,例如,如果你有两套要合并:

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

mergin进程将会:

[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]

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