在链表中的单个索引处存储多个数据项?

时间:2008-10-10 07:13:51

标签: java collections linked-list

我正在尝试将多个数据项存储在我的链表中的单个索引处。我的教科书中的所有示例似乎都说明每个索引只添加1个数据。我假设可以添加更多?

例如,使用Collections API存储整数,我将执行以下操作:

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

如何将num2,num3和num4添加到列表中的同一个第一个索引?多谢你们。

6 个答案:

答案 0 :(得分:15)

关于链表如何工作似乎有些混乱。本质上,链表由节点组成,每个节点包含一个数据(一个对象,其本身可以包含几个成员变量,确切),以及指向列表中下一个节点的链接(如果有,则为空指针)不是这样的下一个节点)。您还可以使用双向链表,其中每个节点还有一个指向列表中上一个节点的指针,以加速某些类型的访问模式。

向单个节点添加多个“数据”听起来像是从一个节点添加多个链接,这会将链接列表转换为N-ary

要以最常与链接列表关联的方式将多个数据添加到列表末尾,只需执行以下操作:

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);
  }
}

现在,linky将有2个节点,每个节点将包含4个int s, myInt1 myInt2 myInt3 myInt4

注意

上述所有内容均不适用于链接列表。只要您想将一堆数据作为一个整体存储在一起,就应该使用此模式。您创建一个类,其中包含要存储在一起的每个数据的成员变量,然后创建该类型的任何Java集合类型(ArrayList,LinkedList,TreeList,...)。

确保您要使用链表(因为在选择ArrayList或TreeList时编程难度不会受到惩罚)。这取决于您的数据访问模式。链接列表提供O(1)添加和删除,但O(n)查找,而ArrayLists提供O(1)查找,但O(n)任意添加和删除。 TreeLists提供O(log n)插入,删除和查找。它们之间的权衡取决于您拥有的数据量以及您将如何修改和访问数据结构。

当然,如果您在列表中只有&lt; 100个元素,那么这一切都不重要; - )

希望这有帮助!

答案 1 :(得分: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,那么我建议你试一试;它会帮助你解决这样的问题。

答案 2 :(得分:1)

为什么不这样:

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

答案 3 :(得分:1)

就像Nelson说你需要另一个Object,尽管你需要使用Class。 如果您需要在您正在使用的类之外​​使用'Node'类,那么您需要将其设置为Public类,并将其移动到它自己的文件中。

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道歉,因为他偷了他的代码;)

答案 4 :(得分: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);
    }
}

答案 5 :(得分: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的解决方案(使用List而不是Node)。如果你在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

很多人都在挑剔,但我认为如果可能的话,首选静态类而不是非静态私有类(并且通常应该是可行的)。