1

リンクリストを実装し、最大10個の名前を格納し、先入れ先出しで最初に並べ替えます。次に、2つのメソッドを実装します。そのうちの1つは、名前のアルファベット順に並べ替えます。これは私がいくつかの問題を抱えているところです。これが私が試したことです:

  1. 再帰。このメソッドは2つのノードを呼び出し、それらを比較し、必要に応じてスワップしてから、それ自体を呼び出します。奇数の名前では機能せず、完全なバグになる傾向があります。

  2. コレクションですが、効果的に使うにはよくわかりません。

  3. 並べ替えアルゴリズム(例:バブルソート):リストを確認することはできますが、ノードを交換するのに苦労しています。

私の質問は:これを行う最も簡単な方法は何ですか?

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

編集

少し作業した後、並べ替えの方法を見つけました。そのために、リストのどこからでもノードを削除できるremoveメソッドを実装しようとしています。コンパイルはしますが、プログラムを実行しても何もしません。

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

3 に答える 3

1

2:コレクションは最も簡単ですが、宿題では許可されていないようです

3:BubbleSortは簡単ですが、最も知られていない並べ替えアルゴリズムですが、宿題にはおそらく問題ありません。

1:これはバブルソートと同じですが、再帰なしで実行することをお勧めします

バブルソートでは、スワップが不要になるまで要素を何度もループし、準備が整います。

于 2012-12-13T21:35:03.917 に答える
0

コレクションはこれを達成するための最も簡単な方法です。

  • 埋め込むComparable
  • オーバーライドhashcodeしてequals
  • Collection.sort()
于 2012-12-13T21:38:29.767 に答える
0

あなたはすでにリンクリストを実装しています、それは良いことです。

ソートアルゴリズムとしてMergeSortを実装することを検討しましたか?分割統治アルゴリズムであるため、リストを形成する要素は常に2つだけになります。

マージ部分は複雑になりますが、簡単でもあります。基本的には、新しいリストを作成し、2つのマージセットの最初の値を比較することで取得した要素でリストを埋め始めます。

したがって、たとえば、マージする2つのセットがある場合:

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

[A]->[B]->[C]->[D]->[E]->[F]
于 2012-12-13T23:00:49.690 に答える