これは課題です。循環リンクリストを作成し、リスト内の3つおきの番号を削除する必要があります。私のプログラムがリストの最後に達すると、先頭に戻り、1つの番号だけが残るまでプロセスを続行する必要があります。
オンラインや他の参考書を検索しましたが、問題を解決できませんでした。私が見つけた参考文献のほとんどは、次のようなことを言っています。
循環リストには終わりがないという事実を除けば、通常のリストとまったく同じです。
または(私の教科書から引用):
最後のノードの後継が最初のノードである場合、単一リンクリストは循環リンクされます
しかし、これらはそれを行う方法を教えていません。このサイトで見つけたコードを使ってみましたが、何もわかりませんでした。
リストを作成して(循環リンクリストかどうかはわかりませんが)表示することはできますが、要素の順序がおかしいです。
- リストに6つの番号がある場合、リストは1,6,5,4,3,2になります。
- リストに8つの番号がある場合、リストは1,8,7,6,5,4,3,2になります。
正しいリストを取得しなくても、正しく削除できます。次のコードの何が問題になっていますか。
public class LastNumberDemo {
public static void main(String[] args) {
LastNumberNode ll=new LastNumberNode();
System.out.println("how long is the list: ");
Scanner keyboard = new Scanner(System.in);
int input = keyboard.nextInt();
if(input<=0) {
System.out.println("no number to creat list");
}
if(input==1) {
System.out.println("The Last number is 1.");
}
else {
String[] n=new String[input];
for(int index=0; index<n.length; index++)
n[index]=Integer.toString(index+1);
for(String e:n)
ll.add(e);
System.out.print("The list contains: \n");
ll.print();
System.out.print("\nThe last number is: ");
ll.remove();
ll.print();
}
}
}
//The circular linked list class
class LastNumberNode{
private class Node{
String value;
Node next;
Node(String val, Node n){
value = val;
next = n;
}
Node(String val){
value=val;
next=null;
}
} //This brace was missing - Edd
private Node first;
public LastNumberNode(){
first = null;
}
public boolean isEmpty(){
return first == null;
}
public int size(){
int count = 0;
Node p = first.next;
while (p != first){
count ++;
p = p.next;
}
return count;
}
public void add(String e) {
Node p=new Node(e);
if(first==null){
first=p;
first.next=first;
}
else{
first.next=new Node(e,first.next);
}
}
public void remove(){
while(size()>0){
Node target=first.next.next;
Node temp=first;
target=target.next;
last.next=temp;
first=target;
}
}
public void print(){
Node ref=first;
for(int index=-1; index<size();index++)
System.out.print(ref.value+" ");
ref=ref.next;
}
} //Extra brace removed - Edd