重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

単方向リストをjavaで書きなさい。
MyListクラス   メソッドを実装
MyListAppクラス メソッドを実行

MyListに実装するメソッド
void insertTail(MyList node):リストの最後へ新規データを追加
void insertHead(MyList node):リストの先頭へ新しいデータを追加
void show():現在のリストを表示する
void insert(MyList node):リストの途中へ新規データを挿入
※データが小さい順に並んでいるとして、新規データも小さい順になるような場所へ挿入できるようにする。
void delete(MyList node):リストからデータを1つ削除
※指定されたデータを見つけ、最初に見つかったデータを削除できるしょうにする。見つからないときは、何もしない。
void deleteHead():先頭のノードを削除する
void deleteTail():最後のノードを削除する

という問題を解いています。

class MyList{
int data;    //データ
MyList next = null;//次のノードへのポインタ

MyList(int data){//新しいノードの作成
this.data = data;
}

void insertTail(MyList node){//リストの最後へ追加
MyList tmp = this;

while(tmp.next != null){
tmp = tmp.next;
}
tmp.next = node;
}

void insertHead(MyList node){//リストの先頭へ追加

node.next = this.next;

this.next = node;
}

void insert(int head, MyList node){ //リストの途中へ新規データを挿入
MyList tmp = this;

while(tmp != null){
if(tmp.data == head){
break;
}
tmp = tmp.next;
}
node.next = tmp.next;
tmp.next = node;

}

void delete(int here, MyList node){//リストからデータを1つ削除
MyList tmp = this;

while(tmp != null){
if(tmp.data == here){
break;
}
tmp = tmp.next;
}
node = tmp.next;
tmp.next = node.next;
node.next = null;

}

void deleteHead(){//先頭のノードを削除
MyList tmp = next;
this.next = tmp.next;
tmp.next = null;

}

void deleteTail(){//最後のノードを削除
MyList tmp = this;

while(tmp.next != null){
tmp = tmp.next;
}

tmp = null;


}

void show(){
MyList tmp = next;
while(true){
System.out.print(tmp.data);
if(tmp.next == null)
break;
tmp = tmp.next;
}
System.out.println("");
}

}

class MyListApp{
public static void main(String[] args){
MyList list = new MyList(0);//初期ダミー

System.out.println("最後に追加");

list.insertTail(new MyList(1));//最後に追加
list.show();

list.insertTail(new MyList(5));
list.show();
System.out.println();

System.out.println("先頭に追加");

list.insertHead(new MyList(8));//先頭に追加
list.show();

list.insertHead(new MyList(9));
list.show();
System.out.println();

System.out.println("途中からデータを追加");

list.insert(1, new MyList(2));//途中からデータの追加
list.show();

list.insert(2, new MyList(3));
list.show();
System.out.println();

System.out.println("リストからデータを削除");

list.delete(8, new MyList(1));//リストからデータを削除
list.show();
System.out.println();

System.out.println("先頭のノードを削除");

list.deleteHead();//先頭のノードを削除
list.show();
list.deleteHead();
list.show();
System.out.println();

System.out.println("最後のノードを削除");

list.deleteTail();//最後のノードを削除
list.show();
list.deleteTail();
list.show();

}
}

ここまではできたのですが、どうしても最後のノード削除ができません。
どうしたらいいでしょうか。

A 回答 (2件)

このソースで何とかするなら以下のような感じでしょうか。



void deleteTail(){ //最後のノードを削除
____MyList tmp = this;
____MyList lastList = null;
____while(tmp.next != null){
________lastList = tmp;
________tmp = tmp.next;
____}
____lastList.next = null;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
すごく助かりました。。

お礼日時:2009/09/10 10:02

元々Cをされていた方でしょうか。



void deleteTail(){ //最後のノードを削除
____MyList tmp = this;
____while(tmp.next != null){
________tmp = tmp.next;
____}
____tmp = null;
}

このメソッドの最後の tmp = null; の部分ですが、
これはローカル変数のtmpの参照先をnullにしただけです。
単純に考えて「最後のノードが削除される」ということは、
最後の1つ前のノードから最後のノードへの参照がnullになるということなので
最後の1つ前のノードのnextにnullを入れてあげれば良いと思います。

この回答への補足

Cやってましたょ。

一つ前というのはソースではどう書いていったらいいでしょうか。

補足日時:2009/09/09 14:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!