2

リンク リストの 1 つのインデックスに複数のデータ項目を格納しようとしています。私の教科書のすべての例は、インデックスごとに 1 つのデータのみを追加することを示しているようです。もっと追加することは可能だと思いますか?

たとえば、コレクション API を使用して整数を格納するには、次のようにします。

LinkedList <Integer>linky = new LinkedList<Integer>();
int num1 = 2, num2 = 22, num3 = 25, num4 = 1337;
linky.add(num1);

リストの同じ最初のインデックスに num2、num3、および num4 を追加するにはどうすればよいですか? みんなありがとう。

4

6 に答える 6

18

リンクされたリストがどのように機能するかについて、少し混乱しているようです。基本的に、リンクされたリストはノードで構成され、各ノードには 1 つのデータ (正確には、それ自体が複数のメンバー変数を含むことができるオブジェクト) と、リスト内の次のノードへのリンク (または存在する場合は null ポインター) が含まれます。そのような次のノードはありません)。また、特定の種類のアクセス パターンを高速化するために、各ノードがリスト内の前のノードへのポインターも持つ二重リンク リストを使用することもできます。

1 つのノードに複数の「データ」を追加することは、1 つのノードから複数のリンクを追加するように聞こえます。これにより、リンク リストが N 分に変わります。

リストの最後に複数のデータを追加するには、リンクされたリストに最も一般的に関連付けられている方法で、次のようにします。

LinkedList <Integer>linky = new LinkedList<Integer>();
int num1 = 2, num2 = 22, num3 = 25, num4 = 1337;
linky.add(num1);
linky.add(num2);
linky.add(num3);
linky.add(num4);

または、リンクされたリストの各ノードに複数のデータを持たせたい場合

これらのデータは、(すべてをメンバー変数として持つ を定義することによって)オブジェクトにパッケージ化する必要があります。class例えば:

class GroupOfFourInts
{
   int myInt1;
   int myInt2;
   int myInt3;
   int myInt4;

   public GroupOfFourInts(int a, int b, int c, int d)
   {
     myInt1 = a; myInt2 = b; myInt3 = c; myInt4 = d;
   }
}

class someOtherClass
{

  public static void main(String[] args)
  {
    LinkedList<GroupOfFourInts> linky = new LinkedList<GroupOfFourInts>();
    GroupOfFourInts group1 = new GroupOfFourInts(1,2,3,4);
    GroupOfFourInts group2 = new GroupOfFourInts(1337,7331,2345,6789);
    linky.add(group1);
    linky.add(group2);
  }
}

これで、linky2 つのノードがあり、それぞれにmyInt1myInt2myInt3、およびmyInt4intの 4 つの sが含まれます。

ノート

上記のいずれも、リンクされたリストに固有のものではありません。このパターンは、一連のデータを 1 つの単位としてまとめて保存する場合に使用する必要があります。まとめて保存するすべてのデータのメンバー変数を持つクラスを作成し、そのタイプの任意の Java コレクション タイプ (ArrayList、LinkedList、TreeList など) を作成します。

リンクされたリストを使用することを確認してください (ArrayList または TreeList を選択する際のプログラミングの難しさの点でペナルティはないため)。これは、データ アクセス パターンによって異なります。リンクされたリストは O(1) の追加と削除を提供しますが、O(n) ルックアップを提供しますが、ArrayLists は O(1) ルックアップを提供しますが、O(n) 任意の追加と削除を提供します。TreeLists は、O(log n) の挿入、削除、およびルックアップを提供します。これらのトレードオフは、所有するデータの量と、データ構造を変更してアクセスする方法によって異なります。

もちろん、リストに 100 個未満の要素しかない場合、これは問題ではありません ;-)

お役に立てれば!

于 2008-10-10T07:18:12.060 に答える
3

構造体を使用してください。

例えば:

private struct Node
{
    int Num1;
    int Num2;
    int Num3;
}

...

LinkedList<Node> list = new LnkedList<Node>();

Node n = new Node();
n.Num1 = 10;
n.Num2 = 100;
n.Num3 = 1000;
list.Add(n);

ノート; これは C# にあると思います。私が間違っている場合は修正してください。コードを修正します;)

本でまだ OOP に触れていない場合は、試してみることをお勧めします。このような問題を解決するのに役立ちます。

于 2008-10-10T07:17:04.293 に答える
1

そのようなものではないのはなぜですか:

LinkedList<LinkedList<Integer>> linky = new LinkedList<LinkedList<Integer>>();
//...
linky.add(new LinkedList<Integer>().add( //...
于 2008-10-10T07:18:07.177 に答える
1

ネルソンが言ったように、クラスを使用する必要がありますが、Javaでは別のオブジェクトが必要です。「ノード」クラスを作業中のクラスの外部で使用する必要がある場合は、それをパブリック クラスにして、独自のファイルに移動する必要があります。

private Class Node
{
    //You might want to make these private, and make setters and getters
    public int Num1;
    public int Num2;
    puclic int Num3;
}

LinkedList<Node> list = new LinkedList<Node>();

Node n = new Node();
n.Num1 = 10;
n.Num2 = 100;
n.Num3 = 1000;
list.Add(n);

Nelson のコードを盗んだことをお詫びします ;)

于 2008-10-10T07:21:33.237 に答える
0

あなたが達成しようとしていることをよく理解していないので、問題を別の方法で読んで解決することをお勧めします(Javaで)。

LinkedList <Integer>linky = new LinkedList<Integer>();
linky.add(num1);

// Lots of code possibly adding elements somewhere else in the list

if (linky.size() > 0) { // Always good to be sure; especially if this is in another methode
 int first = linky.get(0);
 linky.set(0, first + num2);// Value of linky.get(0) is num1 + num2 
}


// The same again
// Lots of code possibly adding elements somewhere else in the list

if (linky.size() > 0) { // Always good to be sure; especially if this is in another methode
 int first = linky.get(0);
 linky.set(0, first + num3); // Value of linky.get(0) is num1 + num2 + num3
}

個人的には、追加する数値の量が一定 (num1 .. num4) の場合、Nelson のソリューションが最も気に入っています。一定でない場合は、Gregor のソリューション (Node の代わりに List を使用) を好みます。Java で Node メソッドを使用する場合は、次のことをお勧めします。

// added static, Class to class
private static class Node
{
    //You might want to make these private, and make setters and getters
    public int Num1;
    public int Num2;
    puclic int Num3;
}

// Prefer interfaces if possible
List<Node> list = new LinkedList<Node>();

Node n = new Node();
n.Num1 = 10;
n.Num2 = 100;
n.Num3 = 1000;
list.add(n); // Add -> add

細かいことはたくさんありますが、可能な場合は非静的プライベート クラスの代わりに静的クラスを使用することをお勧めします (通常は可能なはずです)。

于 2008-10-10T07:35:30.353 に答える
0

リンク リストに構造を追加する方法を示す完全なコード サンプルを次に示します。

import java.util.LinkedList;
class Node {
    int num1;
    int num2;
    int num3;
    int num4;
    public Node(int a, int b, int c, int d) {
        num1 = a; num2 = b; num3 = c; num4 = d;
    }
}
public class dummy {
    public static void main(String[] args) {
        LinkedList <Node>linky = new LinkedList<Node>();
        x myNode = new Node(2, 22, 25, 1337);
        linky.add(myNode);
    }
}
于 2008-10-10T07:28:44.347 に答える