1

SListClass単一リンク リスト クラスとノード クラスを表す を作成しましたSListNode。方法に問題がありremoveLastます。ノードのリストを印刷すると、最初の項目がまだ残っています。理由がわかりません

public class SListClass {
    private SListNode head;
    private double size;

    SListClass(){
        head = null;
        size = 0;
    }
    SListClass(SListNode node){
        head = node;
    }

    public void insertFront(int item){
        head = new SListNode(item, head);
        size++;
    }

    public void addLast(SListNode head, int value){
        SListNode first = head;
        while(first.next != null){
            first = first.next;
        }
        first.next = new SListNode(value, null);
        size++;
    }

    public void removeFirst(SListNode head){
        head = head.next;
    }

    /*public String toString(){
        return String.format(head + "");
    }
    */
    public String  print(){
        String result = head.item + " ";

        if(head.next != null){
            result += head.next.print();
        }
        return result;
    }
    public static void main(String[] args) {

        SListNode list = new SListNode(21, new SListNode(5, new SListNode(19, null)));
        SListClass x = new SListClass(list);

        x.insertFront(33);
        x.insertFront(100);
        x.addLast(list, 123);
        x.addLast(list, 9999);
        x.removeFirst(list);
        System.out.println(x.print());

    }
 }

output: 100 33 21 5 19 123 9999

SListNodeクラス:

public class SListNode {            
    protected int item;
    protected SListNode next;

    public SListNode(int item, SListNode next){
        this.item = item;
        this.next = next;
    }

    public SListNode(int item){
        this(item, null);
    }

    public int getItem() {
        return item;
    }

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

    public SListNode getNext() {
        return next;
    }

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

2 に答える 2

1

まずネーミングが悪い。すべてのクラスはクラスであるため、クラスの名前を で終わらせるのClassはただのノイズです。逆にS何の意味もありません。SListClass が何を表しているのかを説明しなければならない場合、それは名前が不適切であることを意味し、 のような説明の必要のない別の名前を選択する必要がありますSinglyLinkedList

クラスのユーザーは、リストがどのように情報を保持するかを気にする必要はありません。ノードをメソッドに渡す必要はありません。値のみ。したがって、次のメソッドを変更する必要があります。

  • SListClass(SListNode node)-->SinglyLinkedList(int value)
  • void addLast(SListNode head, int value)--> void addLast(int value): リストは、ヘッド ノードが何であるかを認識しています。引数として渡しても意味がありません。
  • void removeFirst(SListNode head)--> void removeFirst(): リストは最初のノードが何であるかを認識しています。引数として渡しても意味がない

API を正しく理解すれば、リストの実際の先頭と、引数として渡された不要な先頭を混同しないため、すべてがはるかに簡単に理解できることがわかります。

于 2013-05-17T13:17:02.570 に答える
1

を に変更removeFirstthis.head = head.nextます。headパラメータ リストの は、クラス フィールドを非表示にしていますhead

また、次のことも考慮してremoveFirstください。メソッドで本当にheadパラメーターが必要ですか、それともhead、更新しようとしているリンク リストの実際のヘッドであるため、代わりにフィールドを使用する必要がありますか? そのパラメーターが不要になった場合は、メソッド シグネチャからパラメーターを削除してください。フィールドheadは非表示にならないので、head = head.next問題ありません。

于 2013-05-17T13:08:43.500 に答える