0

挿入、削除、リストの先頭または末尾への移動など、いくつかの基本的なリンクされたリストに取り組んでいます。基本的に、リストを取得したら、それらすべての概念を理解していますが、設定に問題がありますリスト。私が正しい方向に進んでいるかどうか、皆さんが教えてくれるのではないかと思っていました。(主にセットアップのみ)これは私がこれまでに持っているものです:

public class List {

private int size;
private List linkedList;
List head;
List cur;
List next;

/**
 * Creates an empty list.
 * @pre 
 * @post
 */
public List(){
    linkedList = new List();
    this.head = null;
    cur = head; 
}

/**
 * Delete the current element from this list. The element after the deleted element becomes the new current. 
 * If that's not possible, then the element before the deleted element becomes the new current. 
 * If that is also not possible, then you need to recognize what state the list is in and define current accordingly.
 * Nothing should be done if a delete is not possible.
 * @pre
 * @post
 */ 
public void delete(){

}

/**
 * Get the value of the current element. If this is not possible, throw an IllegalArgumentException.
 * @pre the list is not empty
 * @post
 * @return value of the current element.
 */
public char get(){
    return getItem(cur);
}

/**
 * Go to the last element of the list. If this is not possible, don't change the cursor.
 * @pre
 * @post
 */
public void goLast(){
    while (cur.next != null){
        cur = cur.next;
    }
}

/**
 * Advance the cursor to the next element. If this is not possible, don't change the cursor.
 * @pre
 * @post
 */
public void goNext(){
    if(cur.next != null){
        cur = cur.next;}
    //else do nothing
}

/**
 * Retreat the cursor to the previous element. If this is not possible, don't change the cursor.
 * @pre
 * @post
 */
public void goPrev(){

}

/**
 * Go to top of the list. This is the position before the first element.
 * @pre
 * @post
 */
public void goTop(){

}

/**
 * Go to first element of the list. If this is not possible, don't change the cursor.
 * @pre
 * @post
 */
public void goFirst(){

}

/**
 * Insert the given parameter after the current element. The newly inserted element becomes the current element.
 * @pre
 * @post
 * @param newVal : value to insert after the current element.
 */
public void insert(char newVal){
    cur.setItem(newVal);
    size++;
}

/**
 * Determines if this list is empty. Empty means this list has no elements.
 * @pre
 * @post
 * @return true if the list is empty.
 */
public boolean isEmpty(){
    return head == null;
}

/**
 * Determines the size of the list. The size of the list is the number of elements in the list.
 * @pre
 * @post
 * @return size which is the number of elements in the list.
 */
public int size(){
    return size;
}


public class Node {

    private char item;
    private Node next;

    public Node() {
    }

    public Node(char item) {
            this.item = item;
    }

    public Node(char item, Node next) {
        this.item = item;
        this.next = next;
    }

    public char getItem() {
        return this.item;
    }

    public void setItem(char item) {
        this.item = item;
    }

    public Node getNext() {
        return this.next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}

}

私はノードクラスを問題なく取得しました(まあ、問題なく動作すると思います)が、そのクラスを持つ必要さえありますか? または、それを使用せずに実行できますか (ただ興味があります)。たとえば、リスト クラスのメソッド get() では、ノード クラスの要点だと思っていたにもかかわらず、エラーが発生しているため、ノード クラスから getItem() メソッドを呼び出すことはできません。

要するに、リストを正しく設定していることを確認したいだけです。

助けてくれてありがとう、私はリンクされたリストに慣れていないので、我慢してください!

4

3 に答える 3

0

head、s ではなくs である必要がありcurます。lastNodeList

Nodeまた、 as として宣言する必要があります。そうすればNode<T>、( だけでなく) 任意のタイプのオブジェクトを含めることができますchar。すべての単語charをに置き換える必要があるためT、クラスも にする必要があります。ListList<T>

delete実際には要素を削除する必要がありますが、現在は削除されていません。

また、Listイテレータ機能を (with でcur) 与えました...おそらく、その機能を別のクラスに分離する (またはリストの名前を「IteratedList」に変更する) などのほうがよいでしょう。

そうでなければ、かなりまともなスタートです!

于 2012-11-05T04:58:46.787 に答える
0

非常に重要な何かが欠けていると思います-いくつかのコメント。特に、リストがどのように表現されるかを説明するコメント ブロックを作成する必要があると思います。これには、空の場合、1 つの要素がある場合、および複数の要素がある場合の外観が含まれます。紙と鉛筆を使っていくつかのシナリオに取り組みます。

空のリストがどのように見えるべきかを知っていて、表現が必要なことを行うと確信している場合、コンストラクターは非常に簡単に記述できます

于 2012-11-05T05:00:59.483 に答える
0

私が理解する限りでは。リンクされたリストを作成しているので、List オブジェクトは何らかの方法で Node オブジェクトを使用する必要がありますよね? ヘッド(ノード)、現在(ノード)、次(ノードでもある)、およびサイズ(int)で表されるリストが必要です。

を持っていることに意味があるとは思いませんprivate List linkedList;。うまくいかない理由をよりよく理解するには、手動でリストを初期化してみてください。新しいリストを初期化していることがわかり、それが新しいリストの初期化につながります...など。設計自体でお話しした他の問題に関係なく、エラーが発生しました。

それに取り組み続けてください。また、delete の実装も強化する必要があります。リストからノードを削除するには、サイズを小さくするだけでなく、前のノードが次のノードを参照するようにする必要があります。のようなものprev.next = node.next。しかし、作業を続けてください。この演習では多くのことを学ぶことができます。

于 2012-11-05T05:02:42.497 に答える