1

Nodeリンクされたリストのノードを表す私のクラスは、次のように定義されています。

public class Node
{
    Node next;
    String data;

    public Node (String data)
    {
        this.data = data;
    }
}

そして、私は次のように使用しています:

Node node, head, tail;
String name; // name to be entered
int count = 0;

// initialize the head to null

head = null;

do
{
    System.out.print ("Enter a name. Type q to end.");
    name = stdin.readLine ();

    // create a new node if the user doesn't type q
    if (!name.equals ("q"))
    {
        node = new Node (name);
        node.next = head;
        count++;

        // update the head to point to the new front of the list
        head = node;
    }
}
while (!name.equals ("q"));  // loop continues until "quit" selected
node = head; 

元のリストを変更した場合に備えて、名前をメソッドにバックアップしたいとします。これどうやってするの?ファイルに書き込まずに。

Name はリンクされたリストに保存される変数であり、ユーザーが q を押した後、元のリストをバックトラックまたは表示したい場合に備えて、ユーザーがバックアップとして保存したものを保持しながら、リストを変更したいと考えています。

4

2 に答える 2

1

Node を不変にする方がよいでしょう。したがって、ノードを変更するたびに、新しいノードを作成します。古いものをリンクリストの履歴に保存します。

于 2012-12-04T15:39:49.730 に答える
0

したがって、リンクリスト内の各要素の以前の名前の履歴を保持したいように聞こえます。リンクリストの各ノード内に、そのアイテムの以前の履歴を示す配列またはリンクリストを格納することをお勧めします。例えば:

public class Node
    {
    Node next;
    String data;
    LinkedList<String> history;

    public Node (String data)
    {
        this.data = data;
    }
}

これにはさまざまな方法でデータを入力できますが、すべて実際にはユースケースによって異なります。

また、なぜ独自のリンクリストを実装するのですか?Javaには、すでにリンクリストの実装(java.util.LinkedList)が付属しています。リンクリストの種類の順序付きリストが必要な場合は、これを使用することをお勧めします。これを行った場合は、名前と履歴を持つ新しいデータ構造を作成し、その中に次のように履歴を保持します。

public class DataItem
    {
    String data;
    LinkedList<String> history = new LinkedList<>();

    public DataItem (String data)
    {
        this.data = data;
    }

    public void setData (String data)
    {
        this.history.add(0, this.data);
        this.data = data;
    }
}

最終的に、Javaでは文字列は不変であることを忘れないでください。したがって、文字列は変更できません。前の文字列への参照をどこかに保持する必要があるだけで、値をコピーする必要はありません。

オブジェクトのツリーを最終的にコピーするには、基本的に完全な構造とすべてのコレクションを調べ、各オブジェクトを新しいオブジェクトに複製する、いわゆるディープコピーを実行する必要があります。

于 2012-12-04T15:33:36.693 に答える