2

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

例如,使用 Collections 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

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

将多个“数据片段”添加到单个节点听起来就像从一个节点添加多个链接,这会将您的链接列表变成 N-ary tree

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

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 个intmyInt1myInt2myInt3myInt4

笔记

以上都不是链表特有的。每当您想将一堆数据作为一个单元存储在一起时,都应该使用这种模式。您创建一个类,其中包含要存储在一起的每条数据的成员变量,然后创建该类型的任何 Java 集合类型(ArrayList、LinkedList、TreeList...)。

确保您要使用链表(因为在选择 ArrayList 或 TreeList 时不会因编程困难而受到惩罚)。这将取决于您的数据访问模式。链表提供 O(1) 添加和删除,但 O(n) 查找,而 ArrayList 提供 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);

向尼尔森道歉,因为他窃取了他的代码;)

于 2008-10-10T07:21:33.237 回答
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 回答
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

很多吹毛求疵,但我认为如果可能的话,最好使用静态类而不是非静态私有类(通常应该是可能的)。

于 2008-10-10T07:35:30.353 回答