-2

再帰を使用せずにリンクされたリストを反転する際の問題。

私はこの方法を使用しましたが、これを家に帰って実行しようとすると、機能が良さそうに見えても、リンクされたリストの反転を印刷できません。以前と同じ方法でリンクされたリストを印刷します。

誰かがここで何が悪いのか理解するのを手伝ってもらえますか??

class link {
    int data;
    public link nextlink;

    link(int d1) {
        data = d1;
    }
}

class List{

    link head;
    link revhead;

    List(){
        head = null;
    }

    boolean isEmpty(link head) {
       return head==null;
    }

    void insert(int d1) {
        link templink = new link(d1);
        templink.nextlink = head;
        head = templink;
    }

    void printlist(){
        link head1 = head;
        while(!isEmpty(head1)) {
            System.out.print(head1.data + " ");
            head1 = head1.nextlink;
        }
        System.out.println();
    }

    void reverse() {
        link previous=null,temp=null;
        while(isEmpty(head)) {
            temp = head.nextlink;
            head.nextlink = previous;
            previous = head;
            head = temp;
        }
    }

}

public class LinkedList {

    public static void main(String[] args) {

        List list1 = new List();

        list1.insert(10);
        list1.insert(20);
        list1.insert(30);
        list1.insert(40);
        list1.insert(50);
        list1.printlist();
        list1.reverse();
        list1.printlist();
     }
}
4

5 に答える 5

4

コードには 2 つの問題があります。1: isEmpty(head) をチェックしますが、!isEmpty(head) をチェックする必要があります。2 番目: 最初の問題を修正すると、ループが終了すると 'head' が null になります。

上記の 2 つの問題を修正した正しいコード:

void reverse() {
    link previous = null, temp = null;
    while (!isEmpty(head)) {
        temp = head.nextlink;
        head.nextlink = previous;
        previous = head;
        if (temp == null) {
           break;
        }
        head = temp;
    }

}
于 2012-05-17T17:58:53.557 に答える
0

再帰なしでリンクリストを逆にするための修正されたコード。

class Link {

    int data;
    public Link nextLink;

    Link(int d1) {
        data = d1;
    }
}

class List {

    Link head;
    Link revhead;

    List() {
        head = null;
    }

    boolean isEmpty(Link head) {
        return head == null;
    }

    void insert(int d1) {
        Link tempLink = new Link(d1);
        tempLink.nextLink = head;
        head = tempLink;
    }

    void printlist() {
        Link head1 = head;
        while (!isEmpty(head1)) {
            System.out.print(head1.data + " ");
            head1 = head1.nextLink;
        }
        System.out.println();
    }

    void reverse() {
        Link previous = null, temp = null;
        while (!isEmpty(head)) {
            temp = head.nextLink;
            head.nextLink = previous;
            previous = head;
            head = temp;
        }

        head = previous;
    }
}

public class Main {

    public static void main(String[] args) {

        List list1 = new List();

        list1.insert(10);
        list1.insert(20);
        list1.insert(30);
        list1.insert(40);
        list1.insert(50);
        list1.printlist();
        list1.reverse();
        list1.printlist();
    }
}
于 2012-05-18T06:47:29.253 に答える
0

状態を確認してください: while (isEmpty(head))

「!」を追加するのを忘れました あなたは空ではない間を意味しました...そうします

于 2012-05-17T17:56:30.657 に答える
0

リンクを印刷するときに再帰的な方法が何をするかを考えてみてください。それらをすべて取得するまで、実際には何もしません (つまり、各呼び出しをスタックに配置し、基本ケースに到達すると、スタックから要素をポップします)。

リストの逆を格納するために使用でき、それを印刷できる、すぐに利用できる非スタック構造は何ですか?

于 2012-05-17T17:58:00.530 に答える